7152608: [macosx] Crash in liblwawt.dylib in AccelGlyphCache_RemoveCellInfo
authorbae
Tue, 05 Mar 2013 17:18:55 +0400
changeset 15973 ea0278a3c432
parent 15972 8eaecbafd49d
child 15974 91b0e63e6e83
child 16899 666a37b19844
7152608: [macosx] Crash in liblwawt.dylib in AccelGlyphCache_RemoveCellInfo Reviewed-by: jgodinez, ant
jdk/src/macosx/classes/sun/font/CStrike.java
jdk/src/macosx/classes/sun/font/CStrikeDisposer.java
jdk/src/macosx/native/sun/font/AWTStrike.m
--- a/jdk/src/macosx/classes/sun/font/CStrike.java	Fri Feb 22 23:12:46 2013 -0800
+++ b/jdk/src/macosx/classes/sun/font/CStrike.java	Tue Mar 05 17:18:55 2013 +0400
@@ -500,7 +500,10 @@
                 final Iterator<Long> i = generalCache.values().iterator();
                 while (i.hasNext()) {
                     final long longValue = i.next().longValue();
-                    if (longValue != -1 && longValue != 0) StrikeCache.freeLongPointer(longValue);
+                    if (longValue != -1 && longValue != 0) {
+                        removeGlyphInfoFromCache(longValue);
+                        StrikeCache.freeLongPointer(longValue);
+                    }
                 }
             }
 
@@ -512,7 +515,10 @@
         private static void disposeLongArray(final long[] longArray) {
             for (int i = 0; i < longArray.length; i++) {
                 final long ptr = longArray[i];
-                if (ptr != 0 && ptr != -1) StrikeCache.freeLongPointer(ptr); // free's the native struct pointer
+                if (ptr != 0 && ptr != -1) {
+                    removeGlyphInfoFromCache(ptr);
+                    StrikeCache.freeLongPointer(ptr); // free's the native struct pointer
+                }
             }
         }
 
--- a/jdk/src/macosx/classes/sun/font/CStrikeDisposer.java	Fri Feb 22 23:12:46 2013 -0800
+++ b/jdk/src/macosx/classes/sun/font/CStrikeDisposer.java	Tue Mar 05 17:18:55 2013 +0400
@@ -85,4 +85,6 @@
     }
 
     private native void freeNativeScalerContext(long pContext);
+
+    protected static native void removeGlyphInfoFromCache(long glyphInfo);
 }
--- a/jdk/src/macosx/native/sun/font/AWTStrike.m	Fri Feb 22 23:12:46 2013 -0800
+++ b/jdk/src/macosx/native/sun/font/AWTStrike.m	Tue Mar 05 17:18:55 2013 +0400
@@ -27,11 +27,13 @@
 #import "java_awt_geom_PathIterator.h"
 #import "sun_awt_SunHints.h"
 #import "sun_font_CStrike.h"
+#import "sun_font_CStrikeDisposer.h"
 #import "CGGlyphImages.h"
 #import "CGGlyphOutlines.h"
 #import "AWTStrike.h"
 #import "CoreTextSupport.h"
 //#import "jni_util.h"
+#include "fontscalerdefs.h"
 
 /* Use THIS_FILE when it is available. */
 #ifndef THIS_FILE
@@ -423,3 +425,19 @@
 
     return metrics;
 }
+
+extern void AccelGlyphCache_RemoveAllInfos(GlyphInfo* glyph);
+/*
+ * Class:     sun_font_CStrikeDisposer
+ * Method:    removeGlyphInfoFromCache
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_sun_font_CStrikeDisposer_removeGlyphInfoFromCache
+(JNIEnv *env, jclass cls, jlong glyphInfo)
+{
+    JNF_COCOA_ENTER(env);
+
+    AccelGlyphCache_RemoveAllCellInfos((GlyphInfo*)jlong_to_ptr(glyphInfo));
+
+    JNF_COCOA_EXIT(env);
+}