summaryrefslogtreecommitdiffstats
path: root/src/nativewindow
diff options
context:
space:
mode:
Diffstat (limited to 'src/nativewindow')
-rw-r--r--src/nativewindow/classes/com/jogamp/nativewindow/egl/EGLGraphicsDevice.java11
-rw-r--r--src/nativewindow/classes/com/jogamp/nativewindow/x11/X11GraphicsDevice.java10
-rw-r--r--src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsDevice.java40
-rw-r--r--src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java127
4 files changed, 116 insertions, 72 deletions
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/egl/EGLGraphicsDevice.java b/src/nativewindow/classes/com/jogamp/nativewindow/egl/EGLGraphicsDevice.java
index 63200b393..fb6d39b2f 100644
--- a/src/nativewindow/classes/com/jogamp/nativewindow/egl/EGLGraphicsDevice.java
+++ b/src/nativewindow/classes/com/jogamp/nativewindow/egl/EGLGraphicsDevice.java
@@ -120,6 +120,15 @@ public class EGLGraphicsDevice extends DefaultGraphicsDevice implements Cloneabl
public void clearHandleOwner() {
eglLifecycleCallback = null;
}
-
+ @Override
+ protected Object getHandleOwnership() {
+ return eglLifecycleCallback;
+ }
+ @Override
+ protected Object setHandleOwnership(Object newOwnership) {
+ final EGLDisplayLifecycleCallback oldOwnership = eglLifecycleCallback;
+ eglLifecycleCallback = (EGLDisplayLifecycleCallback) newOwnership;
+ return oldOwnership;
+ }
}
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/x11/X11GraphicsDevice.java b/src/nativewindow/classes/com/jogamp/nativewindow/x11/X11GraphicsDevice.java
index da3b31de4..e630e012e 100644
--- a/src/nativewindow/classes/com/jogamp/nativewindow/x11/X11GraphicsDevice.java
+++ b/src/nativewindow/classes/com/jogamp/nativewindow/x11/X11GraphicsDevice.java
@@ -162,4 +162,14 @@ public class X11GraphicsDevice extends DefaultGraphicsDevice implements Cloneabl
public void clearHandleOwner() {
handleOwner = false;
}
+ @Override
+ protected Object getHandleOwnership() {
+ return Boolean.valueOf(handleOwner);
+ }
+ @Override
+ protected Object setHandleOwnership(Object newOwnership) {
+ final Boolean oldOwnership = Boolean.valueOf(handleOwner);
+ handleOwner = ((Boolean) newOwnership).booleanValue();
+ return oldOwnership;
+ }
}
diff --git a/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsDevice.java b/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsDevice.java
index b3ae4628c..66b81d7fa 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsDevice.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsDevice.java
@@ -185,6 +185,42 @@ public class DefaultGraphicsDevice implements Cloneable, AbstractGraphicsDevice
}
/**
+ * Set the native handle of the underlying native device
+ * and return the previous one.
+ */
+ protected final long setHandle(long newHandle) {
+ final long oldHandle = handle;
+ handle = newHandle;
+ return oldHandle;
+ }
+
+ protected Object getHandleOwnership() {
+ return null;
+ }
+ protected Object setHandleOwnership(Object newOwnership) {
+ return null;
+ }
+
+ public static final void swapDeviceHandleAndOwnership(final DefaultGraphicsDevice aDevice1, final DefaultGraphicsDevice aDevice2) {
+ aDevice1.lock();
+ try {
+ aDevice2.lock();
+ try {
+ final long aDevice1Handle = aDevice1.getHandle();
+ final long aDevice2Handle = aDevice2.setHandle(aDevice1Handle);
+ aDevice1.setHandle(aDevice2Handle);
+ final Object aOwnership1 = aDevice1.getHandleOwnership();
+ final Object aOwnership2 = aDevice2.setHandleOwnership(aOwnership1);
+ aDevice1.setHandleOwnership(aOwnership2);
+ } finally {
+ aDevice2.unlock();
+ }
+ } finally {
+ aDevice1.unlock();
+ }
+ }
+
+ /**
* Set the internal ToolkitLock, which is used within the
* {@link #lock()} and {@link #unlock()} implementation.
*
@@ -194,8 +230,9 @@ public class DefaultGraphicsDevice implements Cloneable, AbstractGraphicsDevice
* </p>
*
* @param locker the ToolkitLock, if null, {@link jogamp.nativewindow.NullToolkitLock} is being used
+ * @return the previous ToolkitLock instance
*/
- protected void setToolkitLock(ToolkitLock locker) {
+ protected ToolkitLock setToolkitLock(ToolkitLock locker) {
final ToolkitLock _toolkitLock = toolkitLock;
_toolkitLock.lock();
try {
@@ -203,6 +240,7 @@ public class DefaultGraphicsDevice implements Cloneable, AbstractGraphicsDevice
} finally {
_toolkitLock.unlock();
}
+ return _toolkitLock;
}
/**
diff --git a/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java b/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java
index 349da8ee6..1f5d33746 100644
--- a/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java
+++ b/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java
@@ -55,6 +55,8 @@ import jogamp.nativewindow.Debug;
import com.jogamp.common.os.Platform;
import com.jogamp.common.util.VersionNumber;
+import com.jogamp.common.util.locks.LockFactory;
+import com.jogamp.common.util.locks.RecursiveLock;
public class JAWTUtil {
public static final boolean DEBUG = Debug.debug("JAWT");
@@ -80,9 +82,7 @@ public class JAWTUtil {
private static final Method sunToolkitAWTUnlockMethod;
private static final boolean hasSunToolkitAWTLock;
- private static volatile Thread exclusiveOwnerThread;
- private static int lockCounter;
-
+ private static final RecursiveLock jawtLock;
private static final ToolkitLock jawtToolkitLock;
private static class PrivilegedDataBlob1 {
@@ -232,26 +232,28 @@ public class JAWTUtil {
}
hasSunToolkitAWTLock = _hasSunToolkitAWTLock;
// hasSunToolkitAWTLock = false;
- exclusiveOwnerThread = null;
- lockCounter = 0;
+ jawtLock = LockFactory.createRecursiveLock();
- jawtToolkitLock = new ToolkitLock() {
+ jawtToolkitLock = new ToolkitLock() {
public final void lock() {
JAWTUtil.lockToolkit();
- if(TRACE_LOCK) { System.err.println("JAWTToolkitLock.lock()"); }
}
public final void unlock() {
- if(TRACE_LOCK) { System.err.println("JAWTToolkitLock.unlock()"); }
JAWTUtil.unlockToolkit();
}
@Override
public final void validateLocked() throws RuntimeException {
JAWTUtil.validateLocked();
}
+ @Override
public final void dispose() {
// nop
- }
- };
+ }
+ @Override
+ public String toString() {
+ return "JAWTToolkitLock[obj 0x"+Integer.toHexString(hashCode())+", isOwner "+jawtLock.isOwner(Thread.currentThread())+", "+jawtLock+"]";
+ }
+ };
// trigger native AWT toolkit / properties initialization
Map<?,?> desktophints = null;
@@ -318,80 +320,65 @@ public class JAWTUtil {
}
/**
- * Locks the AWT's global ReentrantLock.<br>
- *
+ * Locks the AWT's global ReentrantLock.
+ * <p>
* JAWT's native Lock() function calls SunToolkit.awtLock(),
- * which just uses AWT's global ReentrantLock.<br>
+ * which just uses AWT's global ReentrantLock.
+ * </p>
+ * <p>
+ * AWT locking is wrapped through a recursive lock object.
+ * </p>
*/
- private static final void awtLock() {
- if(hasSunToolkitAWTLock) {
- try {
- sunToolkitAWTLockMethod.invoke(null, (Object[])null);
- } catch (Exception e) {
- throw new NativeWindowException("SunToolkit.awtLock failed", e);
+ public static void lockToolkit() throws NativeWindowException {
+ jawtLock.lock();
+ if( 1 == jawtLock.getHoldCount() ) {
+ if(!headlessMode && !isJava2DQueueFlusherThread()) {
+ if(hasSunToolkitAWTLock) {
+ try {
+ sunToolkitAWTLockMethod.invoke(null, (Object[])null);
+ } catch (Exception e) {
+ throw new NativeWindowException("SunToolkit.awtLock failed", e);
+ }
+ } else {
+ jawtLockObject.Lock();
+ }
}
- } else {
- jawtLockObject.Lock();
}
- if(0 == lockCounter) {
- exclusiveOwnerThread = Thread.currentThread();
- }
- lockCounter++;
+ if(ToolkitLock.TRACE_LOCK) { System.err.println("JAWTUtil-ToolkitLock.lock(): "+jawtLock); }
}
/**
- * Unlocks the AWT's global ReentrantLock.<br>
- *
+ * Unlocks the AWT's global ReentrantLock.
+ * <p>
* JAWT's native Unlock() function calls SunToolkit.awtUnlock(),
- * which just uses AWT's global ReentrantLock.<br>
+ * which just uses AWT's global ReentrantLock.
+ * </p>
+ * <p>
+ * AWT unlocking is wrapped through a recursive lock object.
+ * </p>
*/
- private static final void awtUnlock() {
- awtValidateLocked();
- lockCounter--;
- if(0 == lockCounter) {
- exclusiveOwnerThread = null;
- }
- if(hasSunToolkitAWTLock) {
- try {
- sunToolkitAWTUnlockMethod.invoke(null, (Object[])null);
- } catch (Exception e) {
- throw new NativeWindowException("SunToolkit.awtUnlock failed", e);
- }
- } else {
- jawtLockObject.Unlock();
- }
- }
-
- private static final void awtValidateLocked() throws RuntimeException {
- final Thread ct = Thread.currentThread();
- if( ct != exclusiveOwnerThread ) {
- if ( null == exclusiveOwnerThread ) {
- throw new RuntimeException(ct.getName()+": JAWT-ToolkitLock not locked");
- }
- throw new RuntimeException(ct.getName()+": Not JAWT-ToolkitLock owner. Owner is "+exclusiveOwnerThread.getName());
- }
- }
-
- public static void lockToolkit() throws NativeWindowException {
- if(ToolkitLock.TRACE_LOCK) { System.err.println("JAWTUtil-ToolkitLock.lock()"); }
- if(!headlessMode && !isJava2DQueueFlusherThread()) {
- awtLock();
- }
- }
-
public static void unlockToolkit() {
- if(ToolkitLock.TRACE_LOCK) { System.err.println("JAWTUtil-ToolkitLock.unlock()"); }
- if(!headlessMode && !isJava2DQueueFlusherThread()) {
- awtUnlock();
+ jawtLock.validateLocked();
+ if(ToolkitLock.TRACE_LOCK) { System.err.println("JAWTUtil-ToolkitLock.unlock(): "+jawtLock); }
+ if( 1 == jawtLock.getHoldCount() ) {
+ if(!headlessMode && !isJava2DQueueFlusherThread()) {
+ if(hasSunToolkitAWTLock) {
+ try {
+ sunToolkitAWTUnlockMethod.invoke(null, (Object[])null);
+ } catch (Exception e) {
+ throw new NativeWindowException("SunToolkit.awtUnlock failed", e);
+ }
+ } else {
+ jawtLockObject.Unlock();
+ }
+ }
}
+ jawtLock.unlock();
}
public static final void validateLocked() throws RuntimeException {
- if(!headlessMode && !isJava2DQueueFlusherThread()) {
- awtValidateLocked();
- }
- }
-
+ jawtLock.validateLocked();
+ }
public static ToolkitLock getJAWTToolkitLock() {
return jawtToolkitLock;