summaryrefslogtreecommitdiffstats
path: root/src/newt
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2011-02-22 14:21:29 +0100
committerSven Gothel <[email protected]>2011-02-22 14:21:29 +0100
commite587f2a724c79d50118f717cc29fba78cad0feeb (patch)
tree06e2a661139f477a387c4d2835d9359fa7f0399f /src/newt
parent1411387d54bc5d946bd3528f97c9a2a15dd2f9de (diff)
NativeWindow NativeSurface lock/unlock Surface cleanup ; NEWT WindowImpl lock/unlock Surface fix
- Rename lock to surfaceLock to determine it's use - NEWT's WindowImpl windowLock usage is not sufficient for lock/unlock surface. Using distinguished surfaceLock for proper recursion count on lock/unlock surface.
Diffstat (limited to 'src/newt')
-rw-r--r--src/newt/classes/com/jogamp/newt/opengl/GLWindow.java8
-rw-r--r--src/newt/classes/jogamp/newt/WindowImpl.java43
2 files changed, 32 insertions, 19 deletions
diff --git a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java
index f3fab7bce..fee188768 100644
--- a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java
+++ b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java
@@ -76,14 +76,14 @@ public class GLWindow implements GLAutoDrawable, Window, NEWTEventConsumer {
((WindowImpl)this.window).setHandleDestroyNotify(false);
window.addWindowListener(new WindowAdapter() {
public void windowRepaint(WindowUpdateEvent e) {
- if( !GLWindow.this.window.isSurfaceLockedByOtherThread() && !GLWindow.this.helper.isExternalAnimatorAnimating() ) {
+ if( !GLWindow.this.window.isWindowLockedByOtherThread() && !GLWindow.this.helper.isExternalAnimatorAnimating() ) {
display();
}
}
public void windowResized(WindowEvent e) {
sendReshape = true;
- if( !GLWindow.this.window.isSurfaceLockedByOtherThread() && !GLWindow.this.helper.isExternalAnimatorAnimating() ) {
+ if( !GLWindow.this.window.isWindowLockedByOtherThread() && !GLWindow.this.helper.isExternalAnimatorAnimating() ) {
display();
}
}
@@ -99,8 +99,8 @@ public class GLWindow implements GLAutoDrawable, Window, NEWTEventConsumer {
if(isPaused) {
ctrl.resume();
}
- } else if (GLWindow.this.window.isSurfaceLockedByOtherThread()) {
- // Surface is locked by another thread
+ } else if (GLWindow.this.window.isWindowLockedByOtherThread()) {
+ // Window is locked by another thread
// Flag that destroy should be performed on the next
// attempt to display.
sendDestroy = true;
diff --git a/src/newt/classes/jogamp/newt/WindowImpl.java b/src/newt/classes/jogamp/newt/WindowImpl.java
index b0991b748..815fd705e 100644
--- a/src/newt/classes/jogamp/newt/WindowImpl.java
+++ b/src/newt/classes/jogamp/newt/WindowImpl.java
@@ -73,7 +73,8 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
{
public static final boolean DEBUG_TEST_REPARENT_INCOMPATIBLE = Debug.isPropertyDefined("newt.test.Window.reparent.incompatible", true);
- private RecursiveLock windowLock = new RecursiveLock();
+ private RecursiveLock windowLock = new RecursiveLock(); // Window instance wide lock
+ private RecursiveLock surfaceLock = new RecursiveLock(); // Surface only lock
private long windowHandle;
private ScreenImpl screen;
private boolean screenReferenceAdded = false;
@@ -464,7 +465,8 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
public final int lockSurface() {
windowLock.lock();
- int res = windowLock.getRecursionCount() == 0 ? LOCK_SURFACE_NOT_READY : LOCK_SUCCESS;
+ surfaceLock.lock();
+ int res = surfaceLock.getRecursionCount() == 0 ? LOCK_SURFACE_NOT_READY : LOCK_SUCCESS;
if ( LOCK_SURFACE_NOT_READY == res ) {
try {
@@ -481,6 +483,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
}
} finally {
if (LOCK_SURFACE_NOT_READY >= res) {
+ surfaceLock.unlock();
windowLock.unlock();
}
}
@@ -489,9 +492,10 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
}
public final void unlockSurface() {
+ surfaceLock.validateLocked();
windowLock.validateLocked();
- if (windowLock.getRecursionCount() == 0) {
+ if (surfaceLock.getRecursionCount() == 0) {
final AbstractGraphicsDevice adevice = config.getScreen().getDevice();
try {
unlockSurfaceImpl();
@@ -499,21 +503,34 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
adevice.unlock();
}
}
+ surfaceLock.unlock();
windowLock.unlock();
}
- public final boolean isSurfaceLockedByOtherThread() {
+ public final boolean isWindowLockedByOtherThread() {
return windowLock.isLockedByOtherThread();
}
- public final boolean isSurfaceLocked() {
+ public final boolean isWindowLocked() {
return windowLock.isLocked();
}
- public final Thread getSurfaceLockOwner() {
+ public final Thread getWindowLockOwner() {
return windowLock.getOwner();
}
+ public final boolean isSurfaceLockedByOtherThread() {
+ return surfaceLock.isLockedByOtherThread();
+ }
+
+ public final boolean isSurfaceLocked() {
+ return surfaceLock.isLocked();
+ }
+
+ public final Thread getSurfaceLockOwner() {
+ return surfaceLock.getOwner();
+ }
+
public long getSurfaceHandle() {
return windowHandle; // default: return window handle
}
@@ -1372,7 +1389,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
"\n, ParentWindow "+parentWindow+
"\n, ParentWindowHandle "+toHexString(parentWindowHandle)+
"\n, WindowHandle "+toHexString(getWindowHandle())+
- "\n, SurfaceHandle "+toHexString(getSurfaceHandle())+ " (lockedExt "+isSurfaceLockedByOtherThread()+")"+
+ "\n, SurfaceHandle "+toHexString(getSurfaceHandle())+ " (lockedExt window "+isWindowLockedByOtherThread()+", surface "+isSurfaceLockedByOtherThread()+")"+
"\n, Pos "+getX()+"/"+getY()+", size "+getWidth()+"x"+getHeight()+
"\n, Visible "+isVisible()+
"\n, Undecorated "+undecorated+
@@ -1650,8 +1667,8 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
switch(e.getEventType()) {
// special repaint treatment
case WindowEvent.EVENT_WINDOW_REPAINT:
- // queue repaint event in case surface is locked, ie in operation
- if( isSurfaceLocked() ) {
+ // queue repaint event in case window is locked, ie in operation
+ if( isWindowLocked() ) {
// make sure only one repaint event is queued
if(!repaintQueued) {
repaintQueued=true;
@@ -1669,8 +1686,8 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
// common treatment
case WindowEvent.EVENT_WINDOW_RESIZED:
- // queue event in case surface is locked, ie in operation
- if( isSurfaceLocked() ) {
+ // queue event in case window is locked, ie in operation
+ if( isWindowLocked() ) {
if(DEBUG_IMPLEMENTATION) {
System.err.println("Window.consumeEvent: queued "+e);
// Exception ee = new Exception("Window.windowRepaint: "+e);
@@ -2165,10 +2182,6 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
}
}
- protected int getWindowLockRecursionCount() {
- return windowLock.getRecursionCount();
- }
-
//
// Reflection helper ..
//