diff options
author | Kenneth Russel <kbrussel@alum.mit.edu> | 2008-02-03 06:57:11 +0000 |
---|---|---|
committer | Kenneth Russel <kbrussel@alum.mit.edu> | 2008-02-03 06:57:11 +0000 |
commit | 9723c1fc5710051fd52f29c8b960379cc02ae991 (patch) | |
tree | 820613c6f712ce3d99306cde6bcc1737bd47f1b4 | |
parent | 77a06914560fbdd09e7adb19d30be4cf359269a7 (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-x | make/jawt-DrawingSurfaceInfo-CustomJavaCode.java | 38 | ||||
-rw-r--r-- | make/jawt-macosx.cfg | 5 | ||||
-rw-r--r-- | make/jawt-win32.cfg | 5 | ||||
-rw-r--r-- | make/jawt-x11.cfg | 5 | ||||
-rw-r--r-- | src/native/jogl/JAWT_DrawingSurfaceInfo.c | 31 |
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); } |