summaryrefslogtreecommitdiffstats
path: root/src/classes/javax/media/opengl
diff options
context:
space:
mode:
Diffstat (limited to 'src/classes/javax/media/opengl')
-rw-r--r--src/classes/javax/media/opengl/GLCanvas.java13
-rwxr-xr-xsrc/classes/javax/media/opengl/Threading.java6
2 files changed, 18 insertions, 1 deletions
diff --git a/src/classes/javax/media/opengl/GLCanvas.java b/src/classes/javax/media/opengl/GLCanvas.java
index 979c466c2..83072ffc5 100644
--- a/src/classes/javax/media/opengl/GLCanvas.java
+++ b/src/classes/javax/media/opengl/GLCanvas.java
@@ -169,7 +169,18 @@ public class GLCanvas extends Canvas implements GLAutoDrawable {
try {
if (Threading.isSingleThreaded() &&
!Threading.isOpenGLThread()) {
- Threading.invokeOnOpenGLThread(destroyAction);
+ // Workaround for termination issues with applets --
+ // sun.applet.AppletPanel should probably be performing the
+ // remove() call on the EDT rather than on its own thread
+ if (Threading.isAWTMode() &&
+ Thread.holdsLock(getTreeLock())) {
+ // The user really should not be invoking remove() from this
+ // thread -- but since he/she is, we can not go over to the
+ // EDT at this point. Try to destroy the context from here.
+ destroyAction.run();
+ } else {
+ Threading.invokeOnOpenGLThread(destroyAction);
+ }
} else {
destroyAction.run();
}
diff --git a/src/classes/javax/media/opengl/Threading.java b/src/classes/javax/media/opengl/Threading.java
index 7475152e1..896e945d8 100755
--- a/src/classes/javax/media/opengl/Threading.java
+++ b/src/classes/javax/media/opengl/Threading.java
@@ -292,6 +292,12 @@ public class Threading {
}
}
+ /** This is a workaround for AWT-related deadlocks which only seem
+ to show up in the context of applets */
+ static boolean isAWTMode() {
+ return (mode == AWT);
+ }
+
private static void printWorkaroundNotice() {
if (singleThreaded && Debug.verbose()) {
System.err.println("Using " +