aboutsummaryrefslogtreecommitdiffstats
path: root/src/classes
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2006-04-19 23:48:50 +0000
committerKenneth Russel <[email protected]>2006-04-19 23:48:50 +0000
commitd8348ee3761bc8f05c11043a96a90d67c85bd867 (patch)
tree26fa7fbba8370a92d30c794b2dbd9b1b6743b484 /src/classes
parentfe68b4b40a382cbf8b89619fcf747d5886d4118f (diff)
Added detection to JOGLAppletLauncher of whether DRIHack library is
present even if we didn't just download the native library jar. Worked around deadlocks during termination of JOGL applets caused by new code which causes context destruction to be performed on the AWT event queue thread (more correct, but problematic with buggy code such as sun.applet.AppletPanel which performs remove() calls on current thread). git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@729 232f8b59-042b-4e1e-8c03-345bb8c30851
Diffstat (limited to 'src/classes')
-rwxr-xr-xsrc/classes/com/sun/opengl/util/JOGLAppletLauncher.java8
-rw-r--r--src/classes/javax/media/opengl/GLCanvas.java13
-rwxr-xr-xsrc/classes/javax/media/opengl/Threading.java6
3 files changed, 26 insertions, 1 deletions
diff --git a/src/classes/com/sun/opengl/util/JOGLAppletLauncher.java b/src/classes/com/sun/opengl/util/JOGLAppletLauncher.java
index ed0d9f296..303985b69 100755
--- a/src/classes/com/sun/opengl/util/JOGLAppletLauncher.java
+++ b/src/classes/com/sun/opengl/util/JOGLAppletLauncher.java
@@ -455,6 +455,14 @@ public class JOGLAppletLauncher extends Applet {
displayError("Error opening jar file " + localJarFile.getName() + " for reading");
return;
}
+ } else {
+ // Still need to discover whether DRI hack is installed
+ File[] files = installDir.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ if (files[i].getName().indexOf("jogl_drihack") >= 0) {
+ driHackPresent = true;
+ }
+ }
}
loadNativesAndStart(installDir);
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 " +