classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] [patch] fix GTK peer assertion failure


From: Thomas Fitzsimmons
Subject: [cp-patches] [patch] fix GTK peer assertion failure
Date: Tue, 26 Jul 2005 16:30:59 -0400

Hi,

This patch adds two new state tables to GdkGraphics.c.  We were storing
Graphics objects in the GtkGenericPeer state table.  Though technically
incorrect, this didn't cause problems on JamVM nor on libgcj but it did
cause problems on VMs with stricter JNI checking.  This patch eliminates
the assertion failures in native_state.c.  I committed it to mainline.

Tom

2005-07-26  Thomas Fitzsimmons  <address@hidden>

        * gnu/java/awt/peer/gtk/GdkGraphics.java,
        native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c: Add
        static initializer.
        (initStaticState): New method.
        Add new global graphics reference state table and macros.
        * include/gnu_java_awt_peer_gtk_GdkGraphics.h: Regenerate.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c: Use new
        NSA_GET_G_PTR macro to retreive graphics objects.
        * native/jni/gtk-peer/gtkpeer.h: Add new graphics state table and
        macros.

Index: ChangeLog
===================================================================
RCS file: /cvsroot/classpath/classpath/ChangeLog,v
retrieving revision 1.4249
diff -u -r1.4249 ChangeLog
--- ChangeLog   26 Jul 2005 19:14:00 -0000      1.4249
+++ ChangeLog   26 Jul 2005 20:20:56 -0000
@@ -1,3 +1,16 @@
+2005-07-26  Thomas Fitzsimmons  <address@hidden>
+
+       * gnu/java/awt/peer/gtk/GdkGraphics.java,
+       native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c: Add
+       static initializer.
+       (initStaticState): New method.
+       Add new global graphics reference state table and macros.
+       * include/gnu_java_awt_peer_gtk_GdkGraphics.h: Regenerate.
+       * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c: Use new
+       NSA_GET_G_PTR macro to retreive graphics objects.
+       * native/jni/gtk-peer/gtkpeer.h: Add new graphics state table and
+       macros.
+
 2005-07-26  Anthony Balkissoon  <address@hidden>
 
        * javax/swing/plaf/basic/BasicTableUI.java:
Index: gnu/java/awt/peer/gtk/GdkGraphics.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GdkGraphics.java,v
retrieving revision 1.42
diff -u -r1.42 GdkGraphics.java
--- gnu/java/awt/peer/gtk/GdkGraphics.java      2 Jul 2005 20:32:11 -0000       
1.42
+++ gnu/java/awt/peer/gtk/GdkGraphics.java      26 Jul 2005 20:20:56 -0000
@@ -38,6 +38,8 @@
 
 package gnu.java.awt.peer.gtk;
 
+import gnu.classpath.Configuration;
+
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Font;
@@ -52,7 +54,17 @@
 
 public class GdkGraphics extends Graphics
 {
-  private final int native_state = GtkGenericPeer.getUniqueInteger();
+  static 
+  {
+    if (Configuration.INIT_LOAD_LIBRARY)
+      {
+        System.loadLibrary("gtkpeer");
+      }
+    initStaticState ();
+  }
+  
+  static native void initStaticState();
+  private final int native_state = GtkGenericPeer.getUniqueInteger ();
 
   Color color, xorColor;
   GtkComponentPeer component;
Index: include/gnu_java_awt_peer_gtk_GdkGraphics.h
===================================================================
RCS file: 
/cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GdkGraphics.h,v
retrieving revision 1.12
diff -u -r1.12 gnu_java_awt_peer_gtk_GdkGraphics.h
--- include/gnu_java_awt_peer_gtk_GdkGraphics.h 2 Jun 2005 13:18:10 -0000       
1.12
+++ include/gnu_java_awt_peer_gtk_GdkGraphics.h 26 Jul 2005 20:20:56 -0000
@@ -10,6 +10,7 @@
 {
 #endif
 
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initStaticState 
(JNIEnv *env, jclass);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2
 (JNIEnv *env, jobject, jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__II 
(JNIEnv *env, jobject, jint, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initFromImage 
(JNIEnv *env, jobject, jobject);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,v
retrieving revision 1.26
diff -u -r1.26 gnu_java_awt_peer_gtk_GdkGraphics.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c     14 Jul 2005 
22:07:02 -0000      1.26
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c     26 Jul 2005 
20:20:57 -0000
@@ -56,6 +56,40 @@
                                                        "()V");
 }
 
+struct state_table *cp_gtk_native_graphics_state_table;
+
+static struct state_table *native_graphics_global_ref_table;
+
+#define NSA_GLOBAL_G_INIT(env, clazz) \
+  native_graphics_global_ref_table = cp_gtk_init_state_table (env, clazz)
+
+#define NSA_GET_GLOBAL_G_REF(env, obj) \
+  cp_gtk_get_state (env, obj, native_graphics_global_ref_table)
+
+#define NSA_SET_GLOBAL_G_REF(env, obj) \
+  do {jobject *globRefPtr; \
+    globRefPtr = (jobject *) malloc (sizeof (jobject)); \
+    *globRefPtr = (*env)->NewGlobalRef (env, obj); \
+    cp_gtk_set_state (env, obj, native_graphics_global_ref_table, (void 
*)globRefPtr);} while (0)
+
+#define NSA_DEL_GLOBAL_G_REF(env, obj) \
+  do {jobject *globRefPtr = cp_gtk_get_state (env, obj, 
native_graphics_global_ref_table); \
+    cp_gtk_remove_state_slot (env, obj, native_graphics_global_ref_table); \
+    (*env)->DeleteGlobalRef (env, *globRefPtr); \
+    free (globRefPtr);} while (0)
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics_initStaticState
+  (JNIEnv *env, jclass clazz)
+{
+   gdk_threads_enter();
+
+   NSA_G_INIT (env, clazz);
+   NSA_GLOBAL_G_INIT (env, clazz);
+
+   gdk_threads_leave();
+}
+
 #define GDK_STABLE_IS_PIXMAP(d) (GDK_IS_PIXMAP(d))
 
 static GdkPoint *translate_points (JNIEnv *env, jintArray xpoints,
@@ -73,7 +107,7 @@
   gdk_threads_enter ();
 
   g = (struct graphics *) g_malloc (sizeof (struct graphics));
-  g_old = (struct graphics *) NSA_GET_PTR (env, old);
+  g_old = (struct graphics *) NSA_GET_G_PTR (env, old);
 
   *g = *g_old;
 
@@ -87,7 +121,7 @@
 
   gdk_colormap_ref (g->cm);
 
-  NSA_SET_PTR (env, obj, g);
+  NSA_SET_G_PTR (env, obj, g);
 
   gdk_threads_leave ();
 }
@@ -109,7 +143,7 @@
   gdk_colormap_ref (g->cm);
   g->gc = gdk_gc_new (g->drawable);
 
-  NSA_SET_PTR (env, obj, g);
+  NSA_SET_G_PTR (env, obj, g);
 
   gdk_threads_leave ();
 }
@@ -136,7 +170,7 @@
   gdk_colormap_ref (g->cm);
   g->gc = gdk_gc_new (g->drawable);
 
-  NSA_SET_PTR (env, obj, g);
+  NSA_SET_G_PTR (env, obj, g);
 
   gdk_threads_leave ();
 }
@@ -169,7 +203,7 @@
   gdk_gc_copy (g->gc, widget->style->fg_gc[GTK_STATE_NORMAL]);
   color = widget->style->fg[GTK_STATE_NORMAL];
 
-  NSA_SET_PTR (env, obj, g);
+  NSA_SET_G_PTR (env, obj, g);
 
   gdk_threads_leave ();
 }
@@ -183,8 +217,8 @@
 
   gdk_threads_enter ();
 
-  NSA_SET_GLOBAL_REF (env, obj);
-  gref = NSA_GET_GLOBAL_REF (env, obj);
+  NSA_SET_GLOBAL_G_REF (env, obj);
+  gref = NSA_GET_GLOBAL_G_REF (env, obj);
 
   ptr = NSA_GET_PTR (env, peer);
 
@@ -202,7 +236,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_DEL_PTR (env, obj);
+  g = (struct graphics *) NSA_DEL_G_PTR (env, obj);
 
   /* check if dispose has been called already */
   if (!g)
@@ -235,7 +269,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   g->x_offset += x;
   g->y_offset += y;
@@ -255,7 +289,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
   g_assert (g != NULL);
 
   pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
@@ -292,7 +326,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   gdk_draw_line (g->drawable, g->gc, 
                 x + g->x_offset, y + g->y_offset, 
@@ -310,7 +344,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   gdk_draw_rectangle (g->drawable, g->gc, TRUE, 
                      x + g->x_offset, y + g->y_offset, width, height);
@@ -327,7 +361,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   gdk_draw_rectangle (g->drawable, g->gc, FALSE, 
                      x + g->x_offset, y + g->y_offset, width, height);
@@ -345,7 +379,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   gdk_window_copy_area ((GdkWindow *)g->drawable,
                        g->gc,
@@ -369,7 +403,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   if (!g)
     {
@@ -408,7 +442,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   gdk_gc_set_function (g->gc, func);
 
@@ -429,7 +463,7 @@
   color.green = green << 8;
   color.blue = blue << 8;
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
   
   gdk_color_alloc (g->cm, &color);
   gdk_gc_set_foreground (g->gc, &color);
@@ -446,7 +480,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   gdk_draw_arc (g->drawable, g->gc, FALSE, 
                x + g->x_offset, y + g->y_offset, 
@@ -493,7 +527,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
   points = translate_points (env, xpoints, ypoints, npoints,
                             g->x_offset, g->y_offset);
 
@@ -515,7 +549,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
   points = translate_points (env, xpoints, ypoints, npoints,
                             g->x_offset, g->y_offset);
 
@@ -542,7 +576,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
   points = translate_points (env, xpoints, ypoints, npoints,
                             g->x_offset, g->y_offset);
   gdk_draw_polygon (g->drawable, g->gc, TRUE, points, npoints);
@@ -562,7 +596,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   gdk_draw_arc (g->drawable, g->gc, TRUE, 
                x + g->x_offset, y + g->y_offset, 
@@ -580,7 +614,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   gdk_draw_arc (g->drawable, g->gc, FALSE, 
                x + g->x_offset, y + g->y_offset, 
@@ -598,7 +632,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   gdk_draw_arc (g->drawable, g->gc, TRUE, 
                x + g->x_offset, y + g->y_offset, 
@@ -617,7 +651,7 @@
 
   gdk_threads_enter ();
 
-  g = (struct graphics *) NSA_GET_PTR (env, obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, obj);
 
   rectangle.x = x + g->x_offset;
   rectangle.y = y + g->y_offset;
@@ -636,7 +670,7 @@
 
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), jgraphics, 
initComponentGraphicsID);
 
-  NSA_DEL_GLOBAL_REF (cp_gtk_gdk_env(), jgraphics);
+  NSA_DEL_GLOBAL_G_REF (cp_gtk_gdk_env(), jgraphics);
 
   gdk_threads_enter ();
 }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c,v
retrieving revision 1.7
diff -u -r1.7 gnu_java_awt_peer_gtk_GtkImage.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c        14 Jul 2005 
22:07:02 -0000      1.7
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c        26 Jul 2005 
20:20:57 -0000
@@ -310,7 +310,7 @@
   bgColor = ((bg_red & 0xFF) << 16) |
     ((bg_green & 0xFF) << 8) | (bg_blue & 0xFF);
     
-  g = (struct graphics *) NSA_GET_PTR (env, gc_obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, gc_obj);
   
   if (!g || !GDK_IS_DRAWABLE (g->drawable))
     {
@@ -383,7 +383,7 @@
   bgColor = ((bg_red & 0xFF) << 16) |
     ((bg_green & 0xFF) << 8) | (bg_blue & 0xFF);
     
-  g = (struct graphics *) NSA_GET_PTR (env, gc_obj);
+  g = (struct graphics *) NSA_GET_G_PTR (env, gc_obj);
   
   if (!g || !GDK_IS_DRAWABLE (g->drawable))
     {
Index: native/jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.35
diff -u -r1.35 gtkpeer.h
--- native/jni/gtk-peer/gtkpeer.h       14 Jul 2005 22:07:02 -0000      1.35
+++ native/jni/gtk-peer/gtkpeer.h       26 Jul 2005 20:20:57 -0000
@@ -83,6 +83,20 @@
     (*env)->DeleteGlobalRef (env, *globRefPtr); \
     free (globRefPtr);} while (0)
 
+extern struct state_table *cp_gtk_native_graphics_state_table;
+
+#define NSA_G_INIT(env, clazz) \
+  cp_gtk_native_graphics_state_table = cp_gtk_init_state_table (env, clazz)
+
+#define NSA_GET_G_PTR(env, obj) \
+  cp_gtk_get_state (env, obj, cp_gtk_native_graphics_state_table)
+
+#define NSA_SET_G_PTR(env, obj, ptr) \
+  cp_gtk_set_state (env, obj, cp_gtk_native_graphics_state_table, (void *)ptr)
+
+#define NSA_DEL_G_PTR(env, obj) \
+  cp_gtk_remove_state_slot (env, obj, cp_gtk_native_graphics_state_table)
+
 #define SWAPU32(w)                                                     \
   (((w) << 24) | (((w) & 0xff00) << 8) | (((w) >> 8) & 0xff00) | ((w) >> 24))
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]