This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH]: Improve management of object references


This patch prevent that JNI global references be left behind after a widget
destruction, preventing garbage collection and also eliminates small (pointer
size) memory leaks.  It also makes sure JNI global references, and not local
references, are passed to signal handlers (this was working on our JNI
implementation but is not guaranteed to work in others).

This patch was developed following a suggestion by Tom Tromey and Tom
Fitzsimmons.   My thanks to both.

2003-12-12 Fernando Nasser <fnasser@redhat.com>

         * jni/gtk-peer/gtkpeer.h: Extend NSA set of macros to handle a second
         native state table -- native_global_ref_table.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c: Define
         native_global_ref_table pointer.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose): Make sure JNI
         global reference is deleted and memory allocated for pointer freed.
         (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): Use saved
         JNI global reference instead of JNI local reference.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
         (pre_event_handler): Remove compilation warning.
         (connect_awt_hook): Use saved JNI global reference instead of creating
         a new one.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create): Save JNI global
         reference to the Java object.
         (Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals): Remove
         unused variable declaration and add comment.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_create): Save JNI global
         reference to the Java object.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer_create): Ditto.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate): Ditto.
         (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals): Use saved
         JNI global reference instead of JNI local reference.
         (item_toggled): Add debug statement.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
         (Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create): Save JNI global
         reference to the Java object.
         (connect_choice_item_selectable_hook): Use saved JNI global references
         instead of JNI local reference.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer_create): Save JNI
         global reference to the Java object.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create): Save JNI global
         reference to the Java object.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkLabelPeer_create): Ditto.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_create): Ditto.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkMenuPeer_create): Ditto.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
         (Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create): Ditto.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create): Ditto.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create): Ditto.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkListPeer_create): Ditto.
         (Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals): Use saved
         JNI global reference instead of JNI local reference.
         (item_selected): Add debug statement.
         (item_unselected): Add debug statement.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_create): Save JNI global
         reference to the Java object.
         Connect "activate" signal handler using global JNI reference.
         (connect_activate_hook): Removed in favor of inline code.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkPanelPeer_create): Save JNI global
         reference to the Java object.
         (Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals): Use saved
         JNI global reference instead of JNI local reference.  Add FIXME comment.
         (Java_gnu_java_awt_peer_gtk_GtkPanelPeer_gtkPanelNew): Save JNI global
         reference to the Java object.  Add FIXME comment.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create): Save JNI global
         reference to the Java object.
         (Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals): Use saved
         JNI global reference instead of JNI local reference.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals): Use
         saved JNI global reference instead of JNI local reference.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
         (Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create): Save JNI global
         reference to the Java object.
         (Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals): Use saved
         JNI global reference instead of JNI local reference.


Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v
retrieving revision 1.6
diff -c -p -u -r1.6 gnu_java_awt_peer_gtk_GtkButtonPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c	11 Dec 2003 13:50:51 -0000	1.6
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c	11 Dec 2003 21:44:45 -0000
@@ -46,10 +46,16 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer
 {
   GtkWidget *button;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   button = gtk_button_new();
   gtk_widget_show (button);
+
   gdk_threads_leave ();
+
   NSA_SET_PTR (env, obj, button);
 }
 
@@ -74,7 +80,8 @@ JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals
   (JNIEnv *env, jobject obj)
 {
-  void *ptr = NSA_GET_PTR (env, obj);
+  /* FIXME: Do we need to connect any signals here? Otherwise just do not
+     override parent method. */
 
   /* Connect the superclass signals.  */
   Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c,v
retrieving revision 1.2
diff -c -p -u -r1.2 gnu_java_awt_peer_gtk_GtkCanvasPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c	22 Aug 2003 20:33:50 -0000	1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c	11 Dec 2003 21:44:45 -0000
@@ -44,8 +44,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt
 {
   gpointer widget;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   widget = gtk_type_new (gtk_drawing_area_get_type ());
+
   gdk_threads_leave ();
 
   NSA_SET_PTR (env, obj, widget);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c,v
retrieving revision 1.1
diff -c -p -u -r1.1 gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c	31 Jan 2003 17:54:14 -0000	1.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c	11 Dec 2003 21:44:45 -0000
@@ -46,12 +46,17 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxMe
   GtkWidget *widget;
   const char *str;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   str = (*env)->GetStringUTFChars (env, label, NULL);
 
   gdk_threads_enter ();
+  
   widget = gtk_check_menu_item_new_with_label (str);
   gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (widget), 1);
   gtk_widget_show (widget);
+
   gdk_threads_leave ();
 
   (*env)->ReleaseStringUTFChars (env, label, str);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c,v
retrieving revision 1.3
diff -c -p -u -r1.3 gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c	11 Dec 2003 13:50:51 -0000	1.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c	11 Dec 2003 21:44:45 -0000
@@ -82,6 +82,9 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPe
 {
   GtkWidget *button;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
 
   if (group == NULL)
@@ -98,6 +101,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPe
 	}
     }
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), state);
+
   gdk_threads_leave ();
 
   NSA_SET_PTR (env, obj, button);
@@ -108,11 +112,13 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPe
   (JNIEnv *env, jobject obj)
 {
   void *ptr = NSA_GET_PTR (env, obj);
+  jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+  g_assert (gref);
 
   gdk_threads_enter ();
 
   g_signal_connect (G_OBJECT (ptr), "toggled",
-		      GTK_SIGNAL_FUNC (item_toggled), obj);
+		      GTK_SIGNAL_FUNC (item_toggled), *gref);
 
   gdk_threads_leave ();
 
@@ -161,6 +167,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPe
 static void
 item_toggled (GtkToggleButton *item, jobject peer)
 {
+  //g_print ("toggled\n");
   (*gdk_env)->CallVoidMethod (gdk_env, peer,
 			      postItemEventID,
 			      peer,
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c,v
retrieving revision 1.3
diff -c -p -u -r1.3 gnu_java_awt_peer_gtk_GtkChoicePeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c	11 Dec 2003 13:50:51 -0000	1.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c	11 Dec 2003 21:44:45 -0000
@@ -51,7 +51,11 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer
   GtkOptionMenu *option_menu;
   GtkRequisition child_requisition;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   option_menu = GTK_OPTION_MENU (gtk_option_menu_new ());
   menu = gtk_menu_new ();
   gtk_widget_show (menu);
@@ -193,12 +197,19 @@ connect_choice_item_selectable_hook (JNI
 				     GtkItem *item, jobject item_obj)
 {
   struct item_event_hook_info *ie;
+  jobject *peer_objGlobPtr;
+  jobject *item_objGlobPtr;
 
   ie = (struct item_event_hook_info *) 
     malloc (sizeof (struct item_event_hook_info));
 
-  ie->peer_obj = (*env)->NewGlobalRef (env, peer_obj);
-  ie->item_obj = (*env)->NewGlobalRef (env, item_obj);
+  peer_objGlobPtr = NSA_GET_GLOBAL_REF (env, peer_obj);
+  g_assert (peer_objGlobPtr);
+  item_objGlobPtr = NSA_GET_GLOBAL_REF (env, item_obj);
+  g_assert (item_objGlobPtr);
+
+  ie->peer_obj = *peer_objGlobPtr;
+  ie->item_obj = *item_objGlobPtr;
 
   g_signal_connect (G_OBJECT (item), "activate", 
 		      GTK_SIGNAL_FUNC (item_activate), ie);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.10
diff -c -p -u -r1.10 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c	11 Dec 2003 13:50:51 -0000	1.10
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c	11 Dec 2003 21:44:46 -0000
@@ -48,12 +48,16 @@ JNIEXPORT void JNICALL Java_gnu_java_awt
 {
   void *ptr;
 
+  /* Remove entries from state tables */
+  NSA_DEL_GLOBAL_REF (env, obj);
   ptr = NSA_DEL_PTR (env, obj);
 
+  gdk_threads_enter ();
+  
   /* For now the native state for any object must be a widget.
      However, a subclass could override dispose() if required.  */
-  gdk_threads_enter ();
   gtk_widget_destroy (GTK_WIDGET (ptr));
+
   gdk_threads_leave ();
 }
 
@@ -548,11 +552,11 @@ JNIEXPORT void JNICALL Java_gnu_java_awt
 }
 
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals
-  (JNIEnv *env, jobject peer_obj)
+  (JNIEnv *env, jobject obj)
 {
-  void *ptr;
-
-  ptr = NSA_GET_PTR (env, peer_obj);
+  void *ptr = NSA_GET_PTR (env, obj);
+  jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+  g_assert (gref);
 
   gdk_threads_enter ();
 
@@ -567,7 +571,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt
   /* Connect EVENT signal, which happens _before_ any specific signal. */
 
   g_signal_connect (GTK_OBJECT (ptr), "event", 
-                    G_CALLBACK (pre_event_handler), peer_obj);
+                    G_CALLBACK (pre_event_handler), *gref);
 
   gdk_threads_leave ();
 }
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c,v
retrieving revision 1.3
diff -c -p -u -r1.3 gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c	17 Sep 2003 04:39:34 -0000	1.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c	11 Dec 2003 21:44:46 -0000
@@ -47,8 +47,11 @@ Java_gnu_java_awt_peer_gtk_GtkEmbeddedWi
   GtkWidget *window;
   GtkWidget *vbox, *layout;
 
-  gdk_threads_enter ();
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
 
+  gdk_threads_enter ();
+  
   window = gtk_plug_new (window_id);
 
   vbox = gtk_vbox_new (0, 0);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c,v
retrieving revision 1.12
diff -c -p -u -r1.12 gnu_java_awt_peer_gtk_GtkEvents.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c	11 Dec 2003 13:50:51 -0000	1.12
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c	11 Dec 2003 21:44:46 -0000
@@ -1037,15 +1037,17 @@ pre_event_handler (GtkWidget *widget, Gd
     case GDK_KEY_PRESS:
     case GDK_KEY_RELEASE:
       {
-        GtkWindow *window;
         GdkWindow *obj_window;
         jobject *focus_obj_ptr = NULL;
+	int generates_key_typed = 0;
 
         /* A widget with a grab will get key events */
 	if (!GTK_IS_WINDOW (widget))
 	    *focus_obj_ptr = peer;
 	else
 	  {
+            GtkWindow *window;
+
             /* Check if we have an enabled focused widget in this window.
 	       If not don't handle the event. */
 	    window = GTK_WINDOW (widget);
@@ -1079,6 +1081,9 @@ pre_event_handler (GtkWidget *widget, Gd
             /* If the window has no jobject attached we can't send anything */
 	    if (!focus_obj_ptr)
 	      return FALSE;
+	      
+	    /* Should we generate an AWT_KEY_TYPED event? */
+	    generates_key_typed = generates_key_typed_event (event, window->focus_widget);
 	  }	
 
 	if (event->type == GDK_KEY_PRESS)	
@@ -1092,7 +1097,7 @@ pre_event_handler (GtkWidget *widget, Gd
                                         keyevent_to_awt_keychar (event),
                                         keysym_to_awt_keylocation (event));
 
-            if (generates_key_typed_event (event, window->focus_widget))
+            if (generates_key_typed)
               {
                 (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
                                             postKeyEventID,
@@ -1159,10 +1164,11 @@ connect_awt_hook (JNIEnv *env, jobject p
 {
   va_list ap;
   jobject *obj;
+void *ptr = NSA_GET_PTR (env, peer_obj);
 
-  obj = (jobject *) malloc (sizeof (jobject));
-  *obj = (*env)->NewGlobalRef (env, peer_obj);
-  //g_print("Connection obj %p\n", peer_obj);
+  obj = NSA_GET_GLOBAL_REF (env, peer_obj);
+  //g_print("Connection obj %s\n", gtk_widget_get_name (GTK_WIDGET (ptr)));
+  g_assert (obj);
 
   va_start (ap, nwindows);
   {
@@ -1170,7 +1176,6 @@ connect_awt_hook (JNIEnv *env, jobject p
   for (i = 0; i < nwindows; i++)
     {
       GdkWindow* attach = (va_arg (ap, GdkWindow *));
-      //g_print("attach peer obj %p and %p\n", peer_obj, attach);
       attach_jobject(attach, obj);
     }
   }
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c,v
retrieving revision 1.2
diff -c -p -u -r1.2 gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c	11 Dec 2003 13:50:51 -0000	1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c	11 Dec 2003 21:44:46 -0000
@@ -49,8 +49,13 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialog
 {
   gpointer widget;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   widget = gtk_type_new (gtk_file_selection_get_type ());
+
   gdk_threads_leave ();
 
   NSA_SET_PTR (env, obj, widget);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c,v
retrieving revision 1.5
diff -c -p -u -r1.5 gnu_java_awt_peer_gtk_GtkLabelPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c	12 Nov 2003 17:38:22 -0000	1.5
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c	11 Dec 2003 21:44:46 -0000
@@ -48,10 +48,13 @@ Java_gnu_java_awt_peer_gtk_GtkLabelPeer_
   GtkContainer *ebox_container;
   const char *str;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   str = (*env)->GetStringUTFChars (env, text, 0);
 
   gdk_threads_enter ();
-
+  
   ebox = gtk_event_box_new ();
   ebox_container = GTK_CONTAINER (ebox);
   label = gtk_label_new (str);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,v
retrieving revision 1.6
diff -c -p -u -r1.6 gnu_java_awt_peer_gtk_GtkListPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c	11 Dec 2003 13:50:51 -0000	1.6
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c	11 Dec 2003 21:44:46 -0000
@@ -58,7 +58,11 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_c
 {
   GtkWidget *list, *sw;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   list = gtk_clist_new (1);
   gtk_widget_show (list);
   sw = gtk_scrolled_window_new (NULL, NULL);
@@ -66,6 +70,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_c
 				  GTK_POLICY_AUTOMATIC,
 				  GTK_POLICY_AUTOMATIC);
   gtk_container_add (GTK_CONTAINER (sw), list);
+
   gdk_threads_leave ();
 
   NSA_SET_PTR (env, obj, sw);
@@ -90,12 +95,12 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_c
 
 JNIEXPORT void JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals
-  (JNIEnv *env, jobject peer_obj)
+  (JNIEnv *env, jobject obj)
 {
   GtkCList *list;
-  void *ptr;
-
-  ptr = NSA_GET_PTR (env, peer_obj);
+  void *ptr = NSA_GET_PTR (env, obj);
+  jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+  g_assert (gref);
 
   gdk_threads_enter ();
 
@@ -106,17 +111,17 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_c
   list = CLIST_FROM_SW (ptr);
 
   g_signal_connect (G_OBJECT (list), "select_row", 
-		      GTK_SIGNAL_FUNC (item_select), peer_obj);
+		      GTK_SIGNAL_FUNC (item_select), *gref);
 
   g_signal_connect (G_OBJECT (list), "unselect_row", 
-		      GTK_SIGNAL_FUNC (item_unselect), peer_obj);
+		      GTK_SIGNAL_FUNC (item_unselect), *gref);
 
   /* Connect the superclass signals.  */
   /* FIXME: Cannot do that here or it will get the sw and not the list.
      We must a generic way of doing this. */
   /* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, peer_obj); */
   g_signal_connect (GTK_OBJECT (list), "event", 
-                    G_CALLBACK (pre_event_handler), peer_obj);
+                    G_CALLBACK (pre_event_handler), *gref);
 
   gdk_threads_leave ();
 }
@@ -319,6 +324,7 @@ item_select (GtkCList *list __attribute_
 	     GdkEventButton *event __attribute__((unused)), 
 	     jobject peer_obj)
 {
+  //g_print ("select_row\n");
   (*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
 			      postListItemEventID,
 			      row,
@@ -332,6 +338,7 @@ item_unselect (GtkCList *list __attribut
 	       GdkEventButton *event __attribute__((unused)),
 	       jobject peer_obj)
 {
+  //g_print ("unselect_row\n");
   (*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
 			      postListItemEventID,
 			      row,
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,v
retrieving revision 1.9
diff -c -p -u -r1.9 gnu_java_awt_peer_gtk_GtkMainThread.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c	24 Oct 2003 19:40:30 -0000	1.9
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c	11 Dec 2003 21:44:46 -0000
@@ -42,6 +42,7 @@ exception statement from your version. *
 
 #ifdef JVM_SUN
   struct state_table *native_state_table;
+  struct state_table *native_global_ref_table;
 #endif
 
 jmethodID setBoundsCallbackID;
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c,v
retrieving revision 1.1
diff -c -p -u -r1.1 gnu_java_awt_peer_gtk_GtkMenuBarPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c	31 Jan 2003 17:54:14 -0000	1.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c	11 Dec 2003 21:44:46 -0000
@@ -44,9 +44,14 @@ JNIEXPORT void JNICALL Java_gnu_java_awt
 {
   GtkWidget *widget;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   widget = gtk_menu_bar_new ();
   gtk_widget_show (widget);
+
   gdk_threads_leave ();
 
   NSA_SET_PTR (env, obj, widget);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c,v
retrieving revision 1.3
diff -c -p -u -r1.3 gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c	11 Dec 2003 13:50:51 -0000	1.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c	11 Dec 2003 21:44:46 -0000
@@ -40,26 +40,35 @@ exception statement from your version. *
 #include "gnu_java_awt_peer_gtk_GtkMenuItemPeer.h"
 #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
 
-static void
-connect_activate_hook (JNIEnv *, jobject, GtkMenuItem *);
+static void item_activate (GtkMenuItem *item __attribute__((unused)),
+                           jobject *peer_obj);
 
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_create
   (JNIEnv *env, jobject obj, jstring label)
 {
   GtkWidget *widget;
   const char *str;
+  jobject *gref;
+
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+  gref = NSA_GET_GLOBAL_REF (env, obj);
 
   str = (*env)->GetStringUTFChars (env, label, NULL);
 
   gdk_threads_enter ();
-
+  
   if (strcmp (str, "-") == 0) /* "-" signals that we need a separator */
     widget = gtk_menu_item_new ();
   else
     widget = gtk_menu_item_new_with_label (str);
 
-  connect_activate_hook (env, obj, GTK_MENU_ITEM (widget));
+  /* Connect activate hook */
+  g_signal_connect (G_OBJECT (widget), "activate", 
+		      GTK_SIGNAL_FUNC (item_activate), *gref);
+
   gtk_widget_show (widget);
+
   gdk_threads_leave ();
 
   (*env)->ReleaseStringUTFChars (env, label, str);
@@ -101,14 +110,3 @@ item_activate (GtkMenuItem *item __attri
 			      postMenuActionEventID);
 }
 
-static void
-connect_activate_hook (JNIEnv *env, jobject peer_obj, GtkMenuItem *item)
-{
-  jobject *obj;
-
-  obj = (jobject *) malloc (sizeof (jobject));
-  *obj = (*env)->NewGlobalRef (env, peer_obj);
-
-  g_signal_connect (G_OBJECT (item), "activate", 
-		      GTK_SIGNAL_FUNC (item_activate), obj);
-}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c,v
retrieving revision 1.3
diff -c -p -u -r1.3 gnu_java_awt_peer_gtk_GtkMenuPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c	11 Dec 2003 13:50:51 -0000	1.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c	11 Dec 2003 21:44:46 -0000
@@ -92,9 +92,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt
   GtkWidget *menu_title, *menu;
   const char *str;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   str = (*env)->GetStringUTFChars (env, label, NULL);
 
   gdk_threads_enter ();
+  
   menu = gtk_menu_new ();
   
   menu_title = gtk_menu_item_new_with_label (str);
@@ -104,6 +108,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt
   gtk_widget_show (menu_title);
 
   NSA_SET_PTR (env, obj, menu_title);
+
   gdk_threads_leave ();
 
   (*env)->ReleaseStringUTFChars (env, label, str);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c,v
retrieving revision 1.3
diff -c -p -u -r1.3 gnu_java_awt_peer_gtk_GtkPanelPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c	11 Dec 2003 13:50:51 -0000	1.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c	11 Dec 2003 21:44:46 -0000
@@ -46,8 +46,13 @@ Java_gnu_java_awt_peer_gtk_GtkPanelPeer_
 {
   gpointer widget;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   widget = gtk_layout_new (NULL, NULL);
+
   gdk_threads_leave ();
 
   NSA_SET_PTR (env, obj, widget);
@@ -80,13 +85,14 @@ JNIEXPORT void JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals
   (JNIEnv *env, jobject obj)
 {
-  void *ptr;
-
-  ptr = NSA_GET_PTR (env, obj);
+  void *ptr = NSA_GET_PTR (env, obj);
+  jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+  g_assert (gref);
 
   gdk_threads_enter ();
   gtk_widget_realize (GTK_WIDGET (ptr));
 
+  /* FIXME: If we don't need this then remove this method. */
 /*    g_signal_connect (G_OBJECT (ptr), "size_request", GTK_SIGNAL_FUNC (sr), */
 /*  		      NULL); */
   gdk_threads_leave ();
@@ -95,6 +101,8 @@ Java_gnu_java_awt_peer_gtk_GtkPanelPeer_
   Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
 }
 
+/* FIXME: The following doesn't seem to be used.
+   Is not declared as a native function in GtkPanelPeer.java */
 /*
  * Make a new panel.
  */
@@ -105,19 +113,26 @@ Java_gnu_java_awt_peer_gtk_GtkPanelPeer_
   GtkWidget *layout;
   void *parent;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   parent = NSA_GET_PTR (env, parent_obj);
 
   gdk_threads_enter ();
+
   layout = gtk_layout_new (NULL, NULL);
   
   set_parent (layout, GTK_CONTAINER (parent));
 
   gtk_widget_realize (layout);
+
   connect_awt_hook (env, obj, 1, GTK_LAYOUT (layout)->bin_window);
+
   set_visible (layout, 1);
 
-  NSA_SET_PTR (env, obj, layout);
   gdk_threads_leave ();
+
+  NSA_SET_PTR (env, obj, layout);
 }
 
 
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c,v
retrieving revision 1.5
diff -c -p -u -r1.5 gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c	11 Dec 2003 13:50:51 -0000	1.5
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c	11 Dec 2003 21:44:46 -0000
@@ -108,13 +108,18 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarP
   GtkWidget *sb;
   GtkObject *adj;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   adj = gtk_adjustment_new (value, min, max, 
 			    step_incr, page_incr, 
 			    visible_amount);
 
   sb = (orientation) ? gtk_vscrollbar_new (GTK_ADJUSTMENT (adj)) :
                        gtk_hscrollbar_new (GTK_ADJUSTMENT (adj));
+
   gdk_threads_leave ();
 
   NSA_SET_PTR (env, obj, sb);
@@ -141,19 +146,19 @@ JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals
   (JNIEnv *env, jobject obj)
 {
-  void *ptr;
   struct range_scrollbar *rs;
+  void *ptr = NSA_GET_PTR (env, obj);
+  jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+  g_assert (gref);
 
   rs = (struct range_scrollbar *) malloc (sizeof (struct range_scrollbar));
 
-  ptr = NSA_GET_PTR (env, obj);
-
   gdk_threads_enter ();
+
   gtk_widget_realize (GTK_WIDGET (ptr));
 
   rs->range = GTK_RANGE (ptr);
-  rs->scrollbar = (jobject *) malloc (sizeof (jobject));
-  *(rs->scrollbar) = (*env)->NewGlobalRef (env, obj);
+  rs->scrollbar = gref;
 
   g_signal_connect (G_OBJECT (GTK_RANGE (ptr)), 
 		      "move-slider", 
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c,v
retrieving revision 1.2
diff -c -p -u -r1.2 gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c	8 Oct 2003 15:49:33 -0000	1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c	11 Dec 2003 21:44:46 -0000
@@ -45,8 +45,13 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPane
 {
   gpointer window;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   window = gtk_scrolled_window_new (NULL, NULL);
+
   gdk_threads_leave ();
 
   NSA_SET_PTR (env, obj, window);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c,v
retrieving revision 1.9
diff -c -p -u -r1.9 gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c	2 Dec 2003 01:01:07 -0000	1.9
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c	11 Dec 2003 21:44:46 -0000
@@ -46,8 +46,11 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPe
 {
   GtkWidget *text, *sw;
 
-  gdk_threads_enter ();
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
 
+  gdk_threads_enter ();
+  
   text = gtk_text_view_new ();
   gtk_widget_show (text);
 
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c,v
retrieving revision 1.10
diff -c -p -u -r1.10 gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c	11 Dec 2003 13:50:51 -0000	1.10
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c	11 Dec 2003 21:44:46 -0000
@@ -51,26 +51,26 @@ JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals
   (JNIEnv *env, jobject obj)
 {
-  void *ptr;
   GtkTextView *text = NULL;
   GtkTextBuffer *buf;
-
-  ptr = NSA_GET_PTR (env, obj);
+  void *ptr = NSA_GET_PTR (env, obj);
+  jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+  g_assert (gref);
 
   gdk_threads_enter ();
 
   if (GTK_IS_ENTRY(ptr))
     {
       g_signal_connect (GTK_ENTRY (ptr)->im_context, "commit",
-                        G_CALLBACK (textcomponent_commit_cb), obj);
+                        G_CALLBACK (textcomponent_commit_cb), *gref);
 
       g_signal_connect (GTK_EDITABLE (ptr), "changed",
-                        G_CALLBACK (textcomponent_changed_cb), obj);
+                        G_CALLBACK (textcomponent_changed_cb), *gref);
 
       gdk_threads_leave ();
 
       /* Connect the superclass signals.  */
-      Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
+      Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, *gref);
     }
   else
     {
@@ -86,20 +86,20 @@ Java_gnu_java_awt_peer_gtk_GtkTextCompon
       if (text)
 	{
           g_signal_connect (text->im_context, "commit",
-                            G_CALLBACK (textcomponent_commit_cb), obj);
+                            G_CALLBACK (textcomponent_commit_cb), *gref);
 
           buf = gtk_text_view_get_buffer (text);
           if (buf)
             g_signal_connect (buf, "changed",
-                              G_CALLBACK (textcomponent_changed_cb), obj);
+                              G_CALLBACK (textcomponent_changed_cb), *gref);
 
           /* Connect the superclass signals.  */
           /* FIXME: Cannot do that here or it will get the sw and not the list.
              We must a generic way of doing this. */
           /* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env,
-	                                                                 peer_obj); */
+	                                                                 obj); */
           g_signal_connect (GTK_OBJECT (text), "event", 
-                    G_CALLBACK (pre_event_handler), obj);
+                    G_CALLBACK (pre_event_handler), *gref);
 
           gdk_threads_leave ();
 	}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c,v
retrieving revision 1.8
diff -c -p -u -r1.8 gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c	8 Oct 2003 23:38:45 -0000	1.8
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c	11 Dec 2003 21:44:46 -0000
@@ -45,8 +45,13 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldP
 {
   GtkWidget *widget;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   widget = gtk_entry_new ();
+
   gdk_threads_leave ();
 
   NSA_SET_PTR (env, obj, widget);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.10
diff -c -p -u -r1.10 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c	11 Dec 2003 13:50:51 -0000	1.10
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c	11 Dec 2003 21:44:46 -0000
@@ -74,7 +74,11 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer
   void *window_parent;
   GtkWidget *vbox, *layout;
 
+  /* Create global reference and save it for future use */
+  NSA_SET_GLOBAL_REF (env, obj);
+
   gdk_threads_enter ();
+  
   window_widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   window = GTK_WINDOW (window_widget);
 
@@ -179,9 +183,9 @@ JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals
   (JNIEnv *env, jobject obj)
 {
-  void *ptr;
-
-  ptr = NSA_GET_PTR (env, obj);
+  void *ptr = NSA_GET_PTR (env, obj);
+  jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+  g_assert (gref);
 
   gdk_threads_enter ();
 
@@ -189,22 +193,22 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer
 
   /* Connect signals for window event support. */
   g_signal_connect (G_OBJECT (ptr), "delete-event",
-		    G_CALLBACK (window_delete_cb), obj);
+		    G_CALLBACK (window_delete_cb), *gref);
 
   g_signal_connect (G_OBJECT (ptr), "destroy-event",
-		    G_CALLBACK (window_destroy_cb), obj);
+		    G_CALLBACK (window_destroy_cb), *gref);
 
   g_signal_connect (G_OBJECT (ptr), "show",
-		    G_CALLBACK (window_show_cb), obj);
+		    G_CALLBACK (window_show_cb), *gref);
 
   g_signal_connect (G_OBJECT (ptr), "focus-in-event",
-		    G_CALLBACK (window_focus_in_cb), obj);
+		    G_CALLBACK (window_focus_in_cb), *gref);
 
   g_signal_connect (G_OBJECT (ptr), "focus-out-event",
-		    G_CALLBACK (window_focus_out_cb), obj);
+		    G_CALLBACK (window_focus_out_cb), *gref);
 
   g_signal_connect (G_OBJECT (ptr), "window-state-event",
-		    G_CALLBACK (window_window_state_cb), obj);
+		    G_CALLBACK (window_window_state_cb), *gref);
 
   gdk_threads_leave ();
 
Index: jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.10
diff -c -p -u -r1.10 gtkpeer.h
--- jni/gtk-peer/gtkpeer.h	11 Dec 2003 13:50:51 -0000	1.10
+++ jni/gtk-peer/gtkpeer.h	11 Dec 2003 21:44:46 -0000
@@ -61,9 +61,11 @@ exception statement from your version. *
 #ifdef JVM_SUN
 
 extern struct state_table *native_state_table;
+extern struct state_table *native_global_ref_table;
 
 #define NSA_INIT(env, clazz) \
-  native_state_table = init_state_table (env, clazz)
+   do {native_state_table = init_state_table (env, clazz); \
+   native_global_ref_table = init_state_table (env, clazz);} while (0)
 
 #define NSA_GET_PTR(env, obj) \
   get_state (env, obj, native_state_table)
@@ -73,6 +75,21 @@ extern struct state_table *native_state_
 
 #define NSA_DEL_PTR(env, obj) \
   remove_state_slot (env, obj, native_state_table)
+
+#define NSA_GET_GLOBAL_REF(env, obj) \
+  get_state (env, obj, native_global_ref_table)
+
+#define NSA_SET_GLOBAL_REF(env, obj) \
+  do {jobject *globRefPtr; \
+    globRefPtr = (jobject *) malloc (sizeof (jobject)); \
+    *globRefPtr = (*env)->NewGlobalRef (env, obj); \
+    set_state (env, obj, native_global_ref_table, (void *)globRefPtr);} while (0)
+
+#define NSA_DEL_GLOBAL_REF(env, obj) \
+  do {jobject *globRefPtr = get_state (env, obj, native_global_ref_table); \
+    remove_state_slot (env, obj, native_global_ref_table); \
+    (*env)->DeleteGlobalRef (env, *globRefPtr); \
+    free (globRefPtr);} while (0)
 
 #endif /* JVM_SUN */
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]