Hi,

It looks like freetype isn't thread-safe. I tried to improve the
situation somewhat by explicitly synchronizing on the GdkFontPeer
whenever it is used in native code. But I am not really sure that is the
way to go. I also don't have a good testcase atm. So input very welcome.

2006-11-25  Mark Wielaard  <[EMAIL PROTECTED]>

    * gnu/java/awt/peer/gtk/CairoGraphics2D.java (drawGlyphVector):
    Synchronize on font peer.
    (setFont): Likewise.
    * gnu/java/awt/peer/gtk/GdkFontPeer.java (getFontMetrics): Mark
    synchronized.
    (getTextMetrics): Likewise.

Committed,

Mark
Index: gnu/java/awt/peer/gtk/CairoGraphics2D.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java,v
retrieving revision 1.53
diff -u -r1.53 CairoGraphics2D.java
--- gnu/java/awt/peer/gtk/CairoGraphics2D.java	22 Nov 2006 16:46:16 -0000	1.53
+++ gnu/java/awt/peer/gtk/CairoGraphics2D.java	25 Nov 2006 22:19:16 -0000
@@ -1676,9 +1676,10 @@
         float[] positions = gv.getGlyphPositions (0, n, null);
 
         setFont (gv.getFont ());
-	synchronized( this.font ) 
+        GdkFontPeer fontPeer = (GdkFontPeer) font.getPeer();
+	synchronized (fontPeer) 
 	  { 
-	    cairoDrawGlyphVector(nativePointer, (GdkFontPeer)getFont().getPeer(),
+	    cairoDrawGlyphVector(nativePointer, fontPeer,
 				 x, y, n, codes, positions);
 	  }
       }
@@ -1733,7 +1734,11 @@
         ((ClasspathToolkit)(Toolkit.getDefaultToolkit()))
         .getFont(f.getName(), f.getAttributes());    
     
-    cairoSetFont(nativePointer, (GdkFontPeer)getFont().getPeer());
+    GdkFontPeer fontpeer = (GdkFontPeer) getFont().getPeer();
+    synchronized (fontpeer)
+      {
+        cairoSetFont(nativePointer, fontpeer);
+      }
   }
 
   public Font getFont()
@@ -2046,4 +2051,4 @@
 
     return rect;
   }
-}
\ No newline at end of file
+}
Index: gnu/java/awt/peer/gtk/GdkFontPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java,v
retrieving revision 1.21
diff -u -r1.21 GdkFontPeer.java
--- gnu/java/awt/peer/gtk/GdkFontPeer.java	21 Nov 2006 14:14:26 -0000	1.21
+++ gnu/java/awt/peer/gtk/GdkFontPeer.java	25 Nov 2006 22:19:16 -0000
@@ -176,8 +176,8 @@
   private native void dispose ();
   private native void setFont (String family, int style, int size);
 
-  native void getFontMetrics(double [] metrics);
-  native void getTextMetrics(String str, double [] metrics);
+  native synchronized void getFontMetrics(double [] metrics);
+  native synchronized void getTextMetrics(String str, double [] metrics);
 
   native void releasePeerGraphicsResource();
 

Reply via email to