svn commit: r1906188 - in /xmlgraphics/fop/trunk/fop-core/src: main/java/org/apache/fop/fo/properties/PropertyCache.java test/java/org/apache/fop/fonts/FontSelectorTestCase.java
[email protected] Fri, 23 Dec 2022 15:39:40 -0000
| Newsgroups | gmane.text.xml.fop.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: ssteiner
Date: Fri Dec 23 15:39:40 2022
New Revision: 1906188
URL: http://svn.apache.org/viewvc?rev=1906188&view=rev
Log:
FOP-3111: Make property cache thread safe
Modified:
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java
Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java?rev=1906188&r1=1906187&r2=1906188&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/properties/PropertyCache.java Fri Dec 23 15:39:40 2022
@@ -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();
+ }
}
}
Modified: xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java?rev=1906188&r1=1906187&r2=1906188&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/fonts/FontSelectorTestCase.java Fri Dec 23 15:39:40 2022
@@ -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.ArgumentMatche
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.Font
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);
+ }
+ }
+ }
}