From c8a9c59e4838cd43090378a7ed60544449472801 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Thu, 7 Oct 2010 05:22:39 +0200 Subject: Fix: NativeWindow RecursiveToolkitLock, GLWindow lockSurface/unlockSurface Fix: NativeWindow RecursiveToolkitLock - Use notify(), instead of notifyAll(), so only one thread is being awakened for the single resource. Otherwise starvation and timeout happen, since the oldest thread might not get waken up (earlier than other threads) within timeout. - Inner class for all synchronized (flow/mem) fields for easier fine grained sync/lock. Fix: GLWindow lockSurface/unlockSurface - Enter locked surface block only if surface lock could be acquired --- .../classes/com/jogamp/newt/impl/WindowImpl.java | 26 ++++++++++------------ .../classes/com/jogamp/newt/opengl/GLWindow.java | 11 ++++----- 2 files changed, 18 insertions(+), 19 deletions(-) (limited to 'src/newt') diff --git a/src/newt/classes/com/jogamp/newt/impl/WindowImpl.java b/src/newt/classes/com/jogamp/newt/impl/WindowImpl.java index 0e9114145..72c33f596 100644 --- a/src/newt/classes/com/jogamp/newt/impl/WindowImpl.java +++ b/src/newt/classes/com/jogamp/newt/impl/WindowImpl.java @@ -202,7 +202,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer System.err.println("Window.createNative() START ("+getThreadName()+", "+this+")"); } if( null != parentWindow && - NativeWindow.LOCK_SURFACE_NOT_READY >= parentWindow.lockSurface() ) { + NativeSurface.LOCK_SURFACE_NOT_READY >= parentWindow.lockSurface() ) { throw new NativeWindowException("Parent surface lock: not ready: "+parentWindow); } try { @@ -236,26 +236,24 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer private static long getNativeWindowHandle(NativeWindow nativeWindow) { long handle = 0; if(null!=nativeWindow) { - boolean locked=false; - try { - if( NativeWindow.LOCK_SURFACE_NOT_READY < nativeWindow.lockSurface() ) { - locked=true; + boolean wasLocked = false; + if( NativeSurface.LOCK_SURFACE_NOT_READY < nativeWindow.lockSurface() ) { + wasLocked = true; + try { handle = nativeWindow.getWindowHandle(); if(0==handle) { throw new NativeWindowException("Parent native window handle is NULL, after succesful locking: "+nativeWindow); } - } - } catch (NativeWindowException nwe) { - if(DEBUG_IMPLEMENTATION) { - System.err.println("Window.getNativeWindowHandle: not successful yet: "+nwe); - } - } finally { - if(locked) { + } catch (NativeWindowException nwe) { + if(DEBUG_IMPLEMENTATION) { + System.err.println("Window.getNativeWindowHandle: not successful yet: "+nwe); + } + } finally { nativeWindow.unlockSurface(); } } if(DEBUG_IMPLEMENTATION) { - System.err.println("Window.getNativeWindowHandle: locked "+locked+", "+nativeWindow); + System.err.println("Window.getNativeWindowHandle: locked "+wasLocked+", "+nativeWindow); } } return handle; @@ -809,7 +807,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer NativeWindow parentWindowLocked = null; if( null != parentWindow ) { parentWindowLocked = parentWindow; - if(NativeWindow.LOCK_SURFACE_NOT_READY >= parentWindowLocked.lockSurface() ) { + if(NativeSurface.LOCK_SURFACE_NOT_READY >= parentWindowLocked.lockSurface() ) { throw new NativeWindowException("Parent surface lock: not ready: "+parentWindow); } } diff --git a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java index a7104bf1a..d39e0e29b 100644 --- a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java +++ b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java @@ -456,11 +456,12 @@ public class GLWindow implements GLAutoDrawable, Window { if(forceReshape) { sendReshape = true; } - lockSurface(); - try{ - helper.invokeGL(drawable, context, displayAction, initAction); - } finally { - unlockSurface(); + if( NativeSurface.LOCK_SURFACE_NOT_READY < lockSurface() ) { + try{ + helper.invokeGL(drawable, context, displayAction, initAction); + } finally { + unlockSurface(); + } } } } -- cgit v1.2.3