summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Russel <kbrussel@alum.mit.edu>2008-02-03 06:57:11 +0000
committerKenneth Russel <kbrussel@alum.mit.edu>2008-02-03 06:57:11 +0000
commit9723c1fc5710051fd52f29c8b960379cc02ae991 (patch)
tree820613c6f712ce3d99306cde6bcc1737bd47f1b4
parent77a06914560fbdd09e7adb19d30be4cf359269a7 (diff)
Fixed Issue 341: JNI Global Reference in native code prevents clean applet termination
Simplified the native code in JAWT_DrawingSurfaceInfo.c to only fabricate the direct ByteBuffer wrapping the JAWT "platformInfo" struct, moving the construction of the wrapping JAWT_PlatformInfo up to Java. Verified fix with reloading of JOGL applets via the new JNLP applet launching support in the new Java Plug-In. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@1512 232f8b59-042b-4e1e-8c03-345bb8c30851
-rwxr-xr-xmake/jawt-DrawingSurfaceInfo-CustomJavaCode.java38
-rw-r--r--make/jawt-macosx.cfg5
-rw-r--r--make/jawt-win32.cfg5
-rw-r--r--make/jawt-x11.cfg5
-rw-r--r--src/native/jogl/JAWT_DrawingSurfaceInfo.c31
5 files changed, 42 insertions, 42 deletions
diff --git a/make/jawt-DrawingSurfaceInfo-CustomJavaCode.java b/make/jawt-DrawingSurfaceInfo-CustomJavaCode.java
new file mode 100755
index 000000000..2e9bd37b6
--- /dev/null
+++ b/make/jawt-DrawingSurfaceInfo-CustomJavaCode.java
@@ -0,0 +1,38 @@
+public JAWT_PlatformInfo platformInfo() {
+ return newPlatformInfo(platformInfo0(getBuffer()));
+}
+
+private native ByteBuffer platformInfo0(Buffer jthis0);
+
+private static java.lang.reflect.Method platformInfoFactoryMethod;
+
+private static JAWT_PlatformInfo newPlatformInfo(ByteBuffer buf) {
+ if (platformInfoFactoryMethod == null) {
+ String osName = (String) AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ return System.getProperty("os.name").toLowerCase();
+ }
+ });
+ try {
+ Class factoryClass;
+ if (osName.startsWith("wind")) {
+ factoryClass = Class.forName("com.sun.opengl.impl.windows.JAWT_Win32DrawingSurfaceInfo");
+ } else if (osName.startsWith("mac os x")) {
+ factoryClass = Class.forName("com.sun.opengl.impl.macosx.JAWT_MacOSXDrawingSurfaceInfo");
+ } else {
+ // Assume Linux, Solaris, etc. Should probably test for these explicitly.
+ factoryClass = Class.forName("com.sun.opengl.impl.x11.JAWT_X11DrawingSurfaceInfo");
+ }
+ platformInfoFactoryMethod = factoryClass.getMethod("create",
+ new Class[] { ByteBuffer.class });
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ try {
+ return (JAWT_PlatformInfo)
+ platformInfoFactoryMethod.invoke(null, new Object[] { buf });
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+}
diff --git a/make/jawt-macosx.cfg b/make/jawt-macosx.cfg
index a7886a250..1dd4d297e 100644
--- a/make/jawt-macosx.cfg
+++ b/make/jawt-macosx.cfg
@@ -27,7 +27,4 @@ StructPackage JAWT_MacOSXDrawingSurfaceInfo com.sun.opengl.impl.macosx
EmitStruct JAWT_MacOSXDrawingSurfaceInfo
Implements JAWT_MacOSXDrawingSurfaceInfo JAWT_PlatformInfo
-CustomJavaCode JAWT_DrawingSurfaceInfo public JAWT_PlatformInfo platformInfo() {
-CustomJavaCode JAWT_DrawingSurfaceInfo return platformInfo0(getBuffer());
-CustomJavaCode JAWT_DrawingSurfaceInfo }
-CustomJavaCode JAWT_DrawingSurfaceInfo private native JAWT_PlatformInfo platformInfo0(Buffer jthis0);
+IncludeAs CustomJavaCode JAWT_DrawingSurfaceInfo jawt-DrawingSurfaceInfo-CustomJavaCode.java
diff --git a/make/jawt-win32.cfg b/make/jawt-win32.cfg
index 7f9d74e7b..15a642f10 100644
--- a/make/jawt-win32.cfg
+++ b/make/jawt-win32.cfg
@@ -30,7 +30,4 @@ StructPackage JAWT_Win32DrawingSurfaceInfo com.sun.opengl.impl.windows
EmitStruct JAWT_Win32DrawingSurfaceInfo
Implements JAWT_Win32DrawingSurfaceInfo JAWT_PlatformInfo
-CustomJavaCode JAWT_DrawingSurfaceInfo public JAWT_PlatformInfo platformInfo() {
-CustomJavaCode JAWT_DrawingSurfaceInfo return platformInfo0(getBuffer());
-CustomJavaCode JAWT_DrawingSurfaceInfo }
-CustomJavaCode JAWT_DrawingSurfaceInfo private native JAWT_PlatformInfo platformInfo0(Buffer jthis0);
+IncludeAs CustomJavaCode JAWT_DrawingSurfaceInfo jawt-DrawingSurfaceInfo-CustomJavaCode.java
diff --git a/make/jawt-x11.cfg b/make/jawt-x11.cfg
index 43ccef7ec..40ac88b50 100644
--- a/make/jawt-x11.cfg
+++ b/make/jawt-x11.cfg
@@ -27,7 +27,4 @@ StructPackage JAWT_X11DrawingSurfaceInfo com.sun.opengl.impl.x11
EmitStruct JAWT_X11DrawingSurfaceInfo
Implements JAWT_X11DrawingSurfaceInfo JAWT_PlatformInfo
-CustomJavaCode JAWT_DrawingSurfaceInfo public JAWT_PlatformInfo platformInfo() {
-CustomJavaCode JAWT_DrawingSurfaceInfo return platformInfo0(getBuffer());
-CustomJavaCode JAWT_DrawingSurfaceInfo }
-CustomJavaCode JAWT_DrawingSurfaceInfo private native JAWT_PlatformInfo platformInfo0(Buffer jthis0);
+IncludeAs CustomJavaCode JAWT_DrawingSurfaceInfo jawt-DrawingSurfaceInfo-CustomJavaCode.java
diff --git a/src/native/jogl/JAWT_DrawingSurfaceInfo.c b/src/native/jogl/JAWT_DrawingSurfaceInfo.c
index 2bbfc7932..d419f5767 100644
--- a/src/native/jogl/JAWT_DrawingSurfaceInfo.c
+++ b/src/native/jogl/JAWT_DrawingSurfaceInfo.c
@@ -41,26 +41,17 @@
#ifdef WIN32
#define PLATFORM_DSI_SIZE sizeof(JAWT_Win32DrawingSurfaceInfo)
- static const char* platformDSIClassName = "com/sun/opengl/impl/windows/JAWT_Win32DrawingSurfaceInfo";
#elif defined(linux) || defined(__sun) || defined(__FreeBSD__) || defined(_HPUX)
#define PLATFORM_DSI_SIZE sizeof(JAWT_X11DrawingSurfaceInfo)
- static const char* platformDSIClassName = "com/sun/opengl/impl/x11/JAWT_X11DrawingSurfaceInfo";
#elif defined(macosx)
#define PLATFORM_DSI_SIZE sizeof(JAWT_MacOSXDrawingSurfaceInfo)
- static const char* platformDSIClassName = "com/sun/opengl/impl/macosx/JAWT_MacOSXDrawingSurfaceInfo";
#else
ERROR: port JAWT_DrawingSurfaceInfo.c to your platform
#endif
-static jclass platformDSIClass = NULL;
-static jmethodID factoryMethod = NULL;
-
JNIEXPORT jobject JNICALL
Java_com_sun_opengl_impl_JAWT_1DrawingSurfaceInfo_platformInfo0(JNIEnv* env, jobject unused, jobject jthis0) {
JAWT_DrawingSurfaceInfo* dsi;
- jobject dirbuf;
- jclass clazz;
- char sig[512];
dsi = (*env)->GetDirectBufferAddress(env, jthis0);
if (dsi == NULL) {
(*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/RuntimeException"),
@@ -70,25 +61,5 @@ Java_com_sun_opengl_impl_JAWT_1DrawingSurfaceInfo_platformInfo0(JNIEnv* env, job
if (dsi->platformInfo == NULL) {
return NULL;
}
- dirbuf = (*env)->NewDirectByteBuffer(env, dsi->platformInfo, PLATFORM_DSI_SIZE);
- if (dirbuf == NULL) {
- return NULL;
- }
- if (platformDSIClass == NULL) {
- /* Note: possible race condition here but we will only leak a few
- global JNI handles at worst */
- clazz = (*env)->FindClass(env, platformDSIClassName);
- if (clazz == NULL) {
- return NULL;
- }
- clazz = (jclass) (*env)->NewGlobalRef(env, clazz);
- sprintf(sig, "(Ljava/nio/ByteBuffer;)L%s;", platformDSIClassName);
- factoryMethod = (*env)->GetStaticMethodID(env, clazz, "create", sig);
- if (factoryMethod == NULL) {
- (*env)->DeleteGlobalRef(env, clazz);
- return NULL;
- }
- platformDSIClass = clazz;
- }
- return (*env)->CallStaticObjectMethod(env, platformDSIClass, factoryMethod, dirbuf);
+ return (*env)->NewDirectByteBuffer(env, dsi->platformInfo, PLATFORM_DSI_SIZE);
}