[OpenJDK 2D-Dev] Concurrent execution of SunLayoutEngine.getEngine(..) may cause corrupt HashMap

Thorsten Jungblut ulli at netcorner.org
Mon Aug 23 15:48:54 UTC 2010


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 
-    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

More information about the 2d-dev mailing list