diff options
-rw-r--r-- | fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java | 10 | ||||
-rw-r--r-- | fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java | 40 |
2 files changed, 48 insertions, 2 deletions
diff --git a/fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java b/fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java index 5846fb76c..156290fbd 100644 --- a/fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java +++ b/fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java @@ -189,6 +189,14 @@ public final class PropertyCache<T> { } private boolean eq(Object p, Object q) { - return (p == q || p.equals(q)); + if (p == q) { + return true; + } + cleanupLock.lock(); + try { + return p.equals(q); + } finally { + cleanupLock.unlock(); + } } } diff --git a/fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java b/fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java index 0871901cd..10c907296 100644 --- a/fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java +++ b/fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java @@ -19,6 +19,11 @@ package org.apache.fop.fonts; +import java.io.PrintStream; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; @@ -30,12 +35,16 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import org.apache.commons.io.output.NullPrintStream; + import org.apache.fop.datatypes.PercentBaseContext; import org.apache.fop.fo.Constants; import org.apache.fop.fo.FOEventHandler; import org.apache.fop.fo.FOText; import org.apache.fop.fo.PropertyList; +import org.apache.fop.fo.StaticPropertyList; import org.apache.fop.fo.expr.PropertyException; +import org.apache.fop.fo.pagination.Root; import org.apache.fop.fo.properties.CommonFont; import org.apache.fop.fo.properties.EnumProperty; import org.apache.fop.fo.properties.FixedLength; @@ -43,7 +52,6 @@ import org.apache.fop.fo.properties.FontFamilyProperty; import org.apache.fop.fo.properties.NumberProperty; import org.apache.fop.fo.properties.Property; - public class FontSelectorTestCase { private static final FontTriplet LATIN_FONT_TRIPLET = new FontTriplet("Verdana", "normal", 400); @@ -136,4 +144,34 @@ public class FontSelectorTestCase { return CommonFont.getInstance(pList); } + + @Test + public void testFontCacheWithThreads() throws Exception { + PrintStream old = System.err; + System.setErr(new NullPrintStream()); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int i = 0; i < 100000; i++) { + executor.submit(new FontTask()); + } + executor.shutdown(); + executor.awaitTermination(1, TimeUnit.DAYS); + System.setErr(old); + } + + static class FontTask implements Runnable { + public void run() { + try { + Root r = new Root(null); + StaticPropertyList pList = new StaticPropertyList(r, null); + Property x = new FontFamilyProperty.Maker(Constants.PR_FONT_FAMILY).make(pList, "a-963191172", null); + pList.putExplicit(Constants.PR_FONT_FAMILY, x); + CommonFont.getInstance(pList); + x = new FontFamilyProperty.Maker(Constants.PR_FONT_FAMILY).make(pList, "a385863058", null); + pList.putExplicit(Constants.PR_FONT_FAMILY, x); + CommonFont.getInstance(pList); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } } |