7007299: FileFontStrike appears not to be threadsafe?
authorprr
Wed, 22 Dec 2010 13:32:58 -0800
changeset 7750 cb72c76bfec8
parent 7749 e14a1aba2e10
child 7751 3ffe25b53aad
7007299: FileFontStrike appears not to be threadsafe? Reviewed-by: igor, jgodinez
jdk/src/share/classes/sun/font/FileFontStrike.java
--- a/jdk/src/share/classes/sun/font/FileFontStrike.java	Mon Dec 20 10:38:55 2010 +0300
+++ b/jdk/src/share/classes/sun/font/FileFontStrike.java	Wed Dec 22 13:32:58 2010 -0800
@@ -58,7 +58,7 @@
     private static final int SEGINTARRAY   = 3;
     private static final int SEGLONGARRAY  = 4;
 
-    private int glyphCacheFormat = UNINITIALISED;
+    private volatile int glyphCacheFormat = UNINITIALISED;
 
     /* segmented arrays are blocks of 256 */
     private static final int SEGSHIFT = 8;
@@ -522,32 +522,33 @@
     }
 
     /* Called only from synchronized code or constructor */
-    private void initGlyphCache() {
+    private synchronized void initGlyphCache() {
 
         int numGlyphs = mapper.getNumGlyphs();
-
+        int tmpFormat = UNINITIALISED;
         if (segmentedCache) {
             int numSegments = (numGlyphs + SEGSIZE-1)/SEGSIZE;
             if (longAddresses) {
-                glyphCacheFormat = SEGLONGARRAY;
+                tmpFormat = SEGLONGARRAY;
                 segLongGlyphImages = new long[numSegments][];
                 this.disposer.segLongGlyphImages = segLongGlyphImages;
              } else {
-                 glyphCacheFormat = SEGINTARRAY;
+                 tmpFormat = SEGINTARRAY;
                  segIntGlyphImages = new int[numSegments][];
                  this.disposer.segIntGlyphImages = segIntGlyphImages;
              }
         } else {
             if (longAddresses) {
-                glyphCacheFormat = LONGARRAY;
+                tmpFormat = LONGARRAY;
                 longGlyphImages = new long[numGlyphs];
                 this.disposer.longGlyphImages = longGlyphImages;
             } else {
-                glyphCacheFormat = INTARRAY;
+                tmpFormat = INTARRAY;
                 intGlyphImages = new int[numGlyphs];
                 this.disposer.intGlyphImages = intGlyphImages;
             }
         }
+        glyphCacheFormat = tmpFormat;
     }
 
     float getGlyphAdvance(int glyphCode) {