diff options
author | Sven Gothel <[email protected]> | 2014-09-22 07:07:42 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2014-09-22 07:09:09 +0200 |
commit | 657081451f7cceac0b0a58b3c15a10a6d3b4b907 (patch) | |
tree | f88012a08f9a709aff450187819beb8990b6495c /src | |
parent | a8285cf7e4673dc45cf99c0872b3f9a25599e159 (diff) |
Stabilize, fix regression: GLDrawable.invoke(..) and Animator* display-loop 'closure'
GLDrawable.invoke(..) regression of commit c77b8f586cb2553582a42f5b90aeee5ef85f1efe:
'wait' was not set to false, if 'deferredHere' was forced to 'false'.
This could lead to the situation where GLRunnableTask
will catch the exception and supresses it.
Animator/FPSAnimator post exception propagation code
animThread = null; notifyAll();
must be complete to finalize animator state in case of an exception.
Decorate 'handleUncaughtException(..)' w/ try { } finally { }
where the latter ensures the mentioned 'closure'.
Diffstat (limited to 'src')
-rw-r--r-- | src/jogl/classes/com/jogamp/opengl/util/Animator.java | 11 | ||||
-rw-r--r-- | src/jogl/classes/com/jogamp/opengl/util/FPSAnimator.java | 11 | ||||
-rw-r--r-- | src/jogl/classes/jogamp/opengl/GLDrawableHelper.java | 2 |
3 files changed, 16 insertions, 8 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/util/Animator.java b/src/jogl/classes/com/jogamp/opengl/util/Animator.java index 4d61adaa6..c7a03eddb 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/Animator.java +++ b/src/jogl/classes/com/jogamp/opengl/util/Animator.java @@ -237,11 +237,14 @@ public class Animator extends AnimatorBase { stopIssued = false; pauseIssued = false; isAnimating = false; - if( null != displayCaught ) { - handleUncaughtException(displayCaught); + try { + if( null != displayCaught ) { + handleUncaughtException(displayCaught); // may throw exception if null handler + } + } finally { + animThread = null; + Animator.this.notifyAll(); } - animThread = null; - Animator.this.notifyAll(); } } } diff --git a/src/jogl/classes/com/jogamp/opengl/util/FPSAnimator.java b/src/jogl/classes/com/jogamp/opengl/util/FPSAnimator.java index ec6c8aae7..dc4a9a896 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/FPSAnimator.java +++ b/src/jogl/classes/com/jogamp/opengl/util/FPSAnimator.java @@ -232,11 +232,14 @@ public class FPSAnimator extends AnimatorBase { } } isAnimating = false; - if( null != displayCaught ) { - handleUncaughtException(displayCaught); + try { + if( null != displayCaught ) { + handleUncaughtException(displayCaught); // may throw exception if null handler + } + } finally { + animThread = null; + FPSAnimator.this.notifyAll(); } - animThread = null; - FPSAnimator.this.notifyAll(); } } } diff --git a/src/jogl/classes/jogamp/opengl/GLDrawableHelper.java b/src/jogl/classes/jogamp/opengl/GLDrawableHelper.java index 25ff83fc0..f770f2a59 100644 --- a/src/jogl/classes/jogamp/opengl/GLDrawableHelper.java +++ b/src/jogl/classes/jogamp/opengl/GLDrawableHelper.java @@ -899,6 +899,7 @@ public class GLDrawableHelper { if( isGLThread ) { // Run immediately, don't defer since locked by this thread, but isGLThread deferredHere = false; + wait = false; } else { // Locked by this thread, but _not_ isGLThread -> ERROR throw new IllegalStateException("Deferred, wait, isLocked on current and not GL-Thread: thread "+Thread.currentThread()); @@ -964,6 +965,7 @@ public class GLDrawableHelper { if( isGLThread ) { // Run immediately, don't defer since locked by this thread, but isGLThread deferredHere = false; + wait = false; } else { // Locked by this thread, but _not_ isGLThread -> ERROR throw new IllegalStateException("Deferred, wait, isLocked on current and not GL-Thread: thread "+Thread.currentThread()); |