summaryrefslogtreecommitdiffstats
path: root/src/nativewindow/classes
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2020-03-05 19:20:19 +0100
committerSven Gothel <[email protected]>2020-03-05 19:20:19 +0100
commit3e141416ea6c85c14dc622dae57f071d5fd0ff4f (patch)
treeb59b7b782cdf768ba28939c88159e02eafb98f5a /src/nativewindow/classes
parent36ca7245653b1a0897f2070b9acbe0f0898f5949 (diff)
Bug 1398: Expose NativeSurface implementation's RecursiveLock if utilized
This prepares proper release of the acquired NativeSurface lock to cure the missing CGLContext lock, see followup commit.
Diffstat (limited to 'src/nativewindow/classes')
-rw-r--r--src/nativewindow/classes/com/jogamp/nativewindow/NativeSurface.java19
-rw-r--r--src/nativewindow/classes/jogamp/nativewindow/ProxySurfaceImpl.java5
2 files changed, 24 insertions, 0 deletions
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/NativeSurface.java b/src/nativewindow/classes/com/jogamp/nativewindow/NativeSurface.java
index ce0699c56..5433ea6c0 100644
--- a/src/nativewindow/classes/com/jogamp/nativewindow/NativeSurface.java
+++ b/src/nativewindow/classes/com/jogamp/nativewindow/NativeSurface.java
@@ -28,6 +28,8 @@
package com.jogamp.nativewindow;
+import com.jogamp.common.util.locks.RecursiveLock;
+
/**
* Provides low-level information required for
* hardware-accelerated rendering using a surface in a platform-independent manner.
@@ -55,6 +57,23 @@ public interface NativeSurface extends SurfaceUpdatedListener {
/** Returned by {@link #lockSurface()} if the surface is locked, and is unchanged, {@value}. */
public static final int LOCK_SUCCESS = 3;
+
+ /**
+ * Returns the implementation's {@link RecursiveLock} synchronizing multithreaded access
+ * if used. Otherwise {@code null} is being returned.
+ * <p>
+ * {@link NativeSurface}'s {@link RecursiveLock} is only exposed to resolve special
+ * situations within the implementation and its usage is not advised if not absolutely necessary.
+ * </p>
+ * <p>
+ * Note that certain {@link NativeSurface} implementations only use the {@link RecursiveLock}
+ * as an upfront re-entrance lock vehicle, but actually acquire and release
+ * the underlying windowing toolkit's lock facility on the first or last re-entrance lock,
+ * respectively.
+ * </p>
+ */
+ public RecursiveLock getLock();
+
/**
* Lock the surface of this native window.
* <p>
diff --git a/src/nativewindow/classes/jogamp/nativewindow/ProxySurfaceImpl.java b/src/nativewindow/classes/jogamp/nativewindow/ProxySurfaceImpl.java
index 9f650f760..98fb6aa3b 100644
--- a/src/nativewindow/classes/jogamp/nativewindow/ProxySurfaceImpl.java
+++ b/src/nativewindow/classes/jogamp/nativewindow/ProxySurfaceImpl.java
@@ -191,6 +191,11 @@ public abstract class ProxySurfaceImpl implements ProxySurface {
}
@Override
+ public RecursiveLock getLock() {
+ return surfaceLock;
+ }
+
+ @Override
public int lockSurface() throws NativeWindowException, RuntimeException {
surfaceLock.lock();
int res = surfaceLock.getHoldCount() == 1 ? LOCK_SURFACE_NOT_READY : LOCK_SUCCESS; // new lock ?