aboutsummaryrefslogtreecommitdiffstats
path: root/fop-core
diff options
context:
space:
mode:
authorSimon Steiner <ssteiner@apache.org>2022-12-23 15:39:40 +0000
committerSimon Steiner <ssteiner@apache.org>2022-12-23 15:39:40 +0000
commitf262111e5f79d99b9ae254845edf573ba132670d (patch)
treef978b0916b4e05d35a2581400761d5ec9b1beb55 /fop-core
parent1317b5529ca1435fc3f3ecb89b32f8fc237975a5 (diff)
downloadxmlgraphics-fop-f262111e5f79d99b9ae254845edf573ba132670d.tar.gz
xmlgraphics-fop-f262111e5f79d99b9ae254845edf573ba132670d.zip
FOP-3111: Make property cache thread safe
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1906188 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'fop-core')
-rw-r--r--fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java10
-rw-r--r--fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java40
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);
+ }
+ }
+ }
}