I had an occasional crasher with the new portableNativeSync impl. Robert was so kind to point out that the lock object has to be wrapped in a global JNI reference. Duh. Here it comes now.
2007-04-04 Roman Kennke <[EMAIL PROTECTED]> * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c (init_glib_threads): Create global reference on lock object. /Roman -- aicas Allerton Interworks Computer Automated Systems GmbH Haid-und-Neu-Straße 18 * D-76131 Karlsruhe * Germany http://www.aicas.com * Tel: +49-721-663 968-0 USt-Id: DE216375633, Handelsregister HRB 109481, AG Karlsruhe Geschäftsführer: Dr. James J. Hunt
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c,v retrieving revision 1.35 diff -u -1 -5 -r1.35 gnu_java_awt_peer_gtk_GtkToolkit.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c 3 Apr 2007 19:33:45 -0000 1.35 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c 4 Apr 2007 11:29:52 -0000 @@ -101,31 +101,31 @@ JNIEnv * cp_gtk_gdk_env() { union env_union tmp; g_assert((*java_vm)->GetEnv(java_vm, &tmp.void_env, JNI_VERSION_1_2) == JNI_OK); return tmp.jni_env; } GtkWindowGroup *cp_gtk_global_window_group; double cp_gtk_dpi_conversion_factor; static void jni_lock_cb(); static void jni_unlock_cb(); -static void init_glib_threads(jint, jobject); +static void init_glib_threads(JNIEnv*, jint, jobject); static gboolean post_set_running_flag (gpointer); static gboolean set_running_flag (gpointer); static gboolean clear_running_flag (gpointer); static void init_dpi_conversion_factor (void); static void dpi_changed_cb (GtkSettings *settings, GParamSpec *pspec); #if GTK_MINOR_VERSION > 4 static GLogFunc old_glog_func; static void glog_func (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data); #endif @@ -157,31 +157,31 @@ printCurrentThreadID = (*env)->GetStaticMethodID (env, gtkgenericpeer, "printCurrentThread", "()V"); NSA_INIT (env, gtkgenericpeer); g_assert((*env)->GetJavaVM(env, &java_vm) == 0); /* GTK requires a program's argc and argv variables, and requires that they be valid. Set it up. */ argv = (char **) g_malloc (sizeof (char *) * 2); argv[0] = (char *) g_malloc(1); argv[0][0] = '\0'; argv[1] = NULL; - init_glib_threads(portableNativeSync, lock); + init_glib_threads(env, portableNativeSync, lock); /* From GDK 2.0 onwards we have to explicitly call gdk_threads_init */ gdk_threads_init(); gtk_init (&argc, &argv); #if SYNCHRONIZE_GDK XSynchronize (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), True); #endif gtk_widget_set_default_colormap (gdk_rgb_get_colormap ()); /* Make sure queued calls don't get sent to GTK/GDK while we're shutting down. */ atexit (gdk_threads_enter); @@ -244,47 +244,47 @@ { JNIEnv * env = cp_gtk_gdk_env(); if ((*env)->MonitorExit(env, global_lock)) { printf("failure while exiting GTK monitor\n"); } } /** Initialize GLIB's threads properly, based on the value of the gnu.classpath.awt.gtk.portable.native.sync Java system property. If that's unset, use the PORTABLE_NATIVE_SYNC config.h macro. (TODO: In some release following 0.10, that config.h macro will go away.) */ static void -init_glib_threads(jint portableNativeSync, jobject lock) +init_glib_threads(JNIEnv *env, jint portableNativeSync, jobject lock) { if (portableNativeSync < 0) { #ifdef PORTABLE_NATIVE_SYNC /* Default value, if not set by the Java system property */ portableNativeSync = 1; #else portableNativeSync = 0; #endif } if (!g_thread_supported ()) { if (portableNativeSync) { - global_lock = lock; + global_lock = (*env)->NewGlobalRef(env, lock); gdk_threads_set_lock_functions(&jni_lock_cb, &jni_unlock_cb); } g_thread_init(NULL); } else { /* Warn if portable native sync is desired but the threading system is already initialized. In that case we can't override the threading implementation with our portable native sync functions. */ if (portableNativeSync) g_printerr ("peer warning: portable native sync disabled.\n"); } /* Debugging progress message; uncomment if needed: */