Hi,

Compiling the native peers without optimization (-O0) revealed some more asynchronous X errors; this patch adds more locking to the Cairo peers, clearing them up.

Regards,
Francis


2007-04-04  Francis Kung  <[EMAIL PROTECTED]>

        * gnu/java/awt/peer/gtk/CairoGraphics2D.java
        (drawCairoSurface): Made protected.
        * gnu/java/awt/peer/gtk/ComponentGraphics.java
        (cairoDrawGlyphVector): Removed method.
        (cairoSetFont): Removed method.
        (disposeNative): Removed method.
        (drawCairoSurface): New method.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c
        (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawGlyphVector): Added
        locking.
        (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFont): Added 
locking.
        (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_disposeNative): Added 
locking.
Index: gnu/java/awt/peer/gtk/ComponentGraphics.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/ComponentGraphics.java,v
retrieving revision 1.26
diff -u -r1.26 ComponentGraphics.java
--- gnu/java/awt/peer/gtk/ComponentGraphics.java	2 Apr 2007 19:39:26 -0000	1.26
+++ gnu/java/awt/peer/gtk/ComponentGraphics.java	4 Apr 2007 19:19:28 -0000
@@ -560,6 +560,17 @@
    * methods ends up being called, we will deadlock.  The lock is only reentrant
    * when called via our lock() method. 
    */
+  
+  /* These methods are already locked in the superclass CairoGraphics2D
+   * so they do not need to be overridden:
+   * 
+   * public void disposeNative
+   *
+   * protected void cairoDrawGlyphVector
+   * 
+   * protected void cairoSetFont
+   */
+  
   @Override
   protected long init(long pointer)
   {
@@ -579,20 +590,6 @@
   }
   
   @Override
-  public void disposeNative(long pointer)
-  {
-    try
-    {
-      lock();
-      super.disposeNative(pointer);
-    }
-    finally
-    {
-      unlock();
-    }
-  }
-  
-  @Override
   protected void drawPixels(long pointer, int[] pixels, int w, int h,
                             int stride, double[] i2u, double alpha,
                             int interpolation)
@@ -742,39 +739,7 @@
       unlock();
     }
   }
-  
-  @Override
-  protected void cairoDrawGlyphVector(long pointer, GdkFontPeer font,
-                                      float x, float y, int n,
-                                      int[] codes, float[] positions,
-                                      long[] fontset)
-  {
-    try
-    {
-      lock();
-      super.cairoDrawGlyphVector(pointer, font, x, y, n, codes, positions,
-                                 fontset);
-    }
-    finally
-    {
-      unlock();
-    }
-  }
-  
-  @Override
-  protected void cairoSetFont(long pointer, GdkFontPeer font)
-  {
-    try
-    {
-      lock();
-      super.cairoSetFont(pointer, font);
-    }
-    finally
-    {
-      unlock();
-    }
-  }
-  
+
   @Override
   protected void cairoRectangle(long pointer, double x, double y,
                                 double width, double height)
@@ -973,4 +938,19 @@
       unlock();
     }
   }
+  
+  @Override
+  protected void drawCairoSurface(CairoSurface surface, AffineTransform tx,
+                                  double alpha, int interpolation)
+  {
+    try
+    {
+      lock();
+      super.drawCairoSurface(surface, tx, alpha, interpolation);
+    }
+    finally
+    {
+      unlock();
+    }
+  }
 }
\ No newline at end of file
Index: gnu/java/awt/peer/gtk/CairoGraphics2D.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java,v
retrieving revision 1.68
diff -u -r1.68 CairoGraphics2D.java
--- gnu/java/awt/peer/gtk/CairoGraphics2D.java	2 Apr 2007 19:39:26 -0000	1.68
+++ gnu/java/awt/peer/gtk/CairoGraphics2D.java	4 Apr 2007 19:19:28 -0000
@@ -1623,8 +1623,8 @@
    * @param alpha The alpha value to paint with ( 0 <= alpha <= 1).
    * @param interpolation The interpolation type.
    */
-  private void drawCairoSurface(CairoSurface surface, AffineTransform tx,
-                                double alpha, int interpolation)
+  protected void drawCairoSurface(CairoSurface surface, AffineTransform tx,
+                                  double alpha, int interpolation)
   {
     // Find offset required if this surface is a sub-raster, and append offset
     // to transformation.
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c,v
retrieving revision 1.22
diff -u -r1.22 gnu_java_awt_peer_gtk_CairoGraphics2D.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c	2 Apr 2007 19:39:26 -0000	1.22
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c	4 Apr 2007 19:19:28 -0000
@@ -87,7 +87,11 @@
     return;
 
   if (gr->cr)
-    cairo_destroy (gr->cr);
+    {
+      gdk_threads_enter();
+      cairo_destroy (gr->cr);
+      gdk_threads_leave();
+    }
 
   if (gr->pattern)
     cairo_pattern_destroy (gr->pattern);
@@ -345,6 +349,7 @@
 
   /* Iterate through glyphs and draw */
   jlong* fonts = (*env)->GetLongArrayElements (env, java_fontset, NULL);
+  gdk_threads_enter();
   for (i = 0; i < n; i++)
     {
       PangoFcFont *font = JLONG_TO_PTR(PangoFcFont, fonts[i]);
@@ -367,6 +372,7 @@
       cairo_font_face_destroy (ft);
       pango_fc_font_unlock_face(font);
     }
+    gdk_threads_leave();
     
   g_free(glyphs);
 }
@@ -388,6 +394,7 @@
   pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
   g_assert (pfont != NULL);
 
+  gdk_threads_enter();
   face = pango_fc_font_lock_face( (PangoFcFont *)pfont->font );
   g_assert (face != NULL);
 
@@ -401,6 +408,7 @@
                        
   cairo_font_face_destroy (ft);
   pango_fc_font_unlock_face((PangoFcFont *)pfont->font);
+  gdk_threads_leave();
 }
 
 JNIEXPORT void JNICALL

Reply via email to