This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[PATCH]: Improve management of object references
- From: Fernando Nasser <fnasser at redhat dot com>
- To: GCJ Patches <java-patches at gcc dot gnu dot org>
- Date: Fri, 12 Dec 2003 14:46:49 -0500
- Subject: [PATCH]: Improve management of object references
- Organization: Red Hat , Inc. - Toronto
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 */