Hi,

if java.awt.font.TextLayout is used concurrently within multiple threads, threads can become stuck in an endless loop caused by a corrupt HashMap.

This problem seems to caused by calls to
sun.font.SunLayoutEngine.getEngine(LayoutEngineKey key)
during initilization of TextLayout at
java.awt.font.TextLayout(String string, Font font, FontRenderContext frc)

SunLayoutEngine.getEngine(LayoutEngineKey) accesses a SoftReference and a HashMap without proper synchronisation. This may lead to the HashMap being corrupted. Any subsequent call to this method causes an endless loop.

Imho the problem is solved by synchronize access to the used SoftReference and HashMap.

I created a patch (using latest OpenJDK7 sources from mercurial):

diff -r fd28003bc1d6 src/share/classes/sun/font/SunLayoutEngine.java
--- a/src/share/classes/sun/font/SunLayoutEngine.java Mon Aug 23 14:35:22 2010 +0100 +++ b/src/share/classes/sun/font/SunLayoutEngine.java Mon Aug 23 17:38:59 2010 +0200
@@ -128,7 +128,7 @@
     }

// !!! don't need this unless we have more than one sun layout engine...
-    public LayoutEngine getEngine(LayoutEngineKey key) {
+    public synchronized LayoutEngine getEngine(LayoutEngineKey key) {
         HashMap cache = (HashMap)cacheref.get();
         if (cache == null) {
             cache = new HashMap();



This will cause access to the hole method to be synchronized so that neither 'cache' nor 'cacheref' are accessed concurrently and so nothing can get corrupted.

Any comments are welcome.

Best regards
Thorsten

Reply via email to