7007299: FileFontStrike appears not to be threadsafe?

Reviewed-by: igor, jgodinez
This commit is contained in:
Phil Race 2010-12-22 13:32:58 -08:00
parent 66b5a3c0ed
commit decbe031fc

View File

@ -58,7 +58,7 @@ public class FileFontStrike extends PhysicalStrike {
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 @@ public class FileFontStrike extends PhysicalStrike {
}
/* 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) {