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();