You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2017/10/02 14:32:43 UTC
svn commit: r1810361 - in
/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl:
CASImpl.java FSClassRegistry.java TypeSystemImpl.java
Author: schor
Date: Mon Oct 2 14:32:42 2017
New Revision: 1810361
URL: http://svn.apache.org/viewvc?rev=1810361&view=rev
Log:
[UIMA-5597] explicitly track pear generators separately
Modified:
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeSystemImpl.java
Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java?rev=1810361&r1=1810360&r2=1810361&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java Mon Oct 2 14:32:42 2017
@@ -1525,6 +1525,8 @@ public class CASImpl extends AbstractCas
// at the same time
final ClassLoader cl = getJCasClassLoader();
synchronized (ts) {
+// //debug
+// System.out.format("debug committing ts %s classLoader %s%n", ts.hashCode(), cl);
if (!ts.isCommitted()) {
TypeSystemImpl tsc = ts.commit(getJCasClassLoader());
if (tsc != ts) {
Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java?rev=1810361&r1=1810360&r2=1810361&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java Mon Oct 2 14:32:42 2017
@@ -205,6 +205,8 @@ public abstract class FSClassRegistry {
* Current FsGenerator[] kept in CASImpl shared view data, switched as needed for PEARs.
*/
private static final Map<ClassLoader, Map<String, JCasClassInfo>> cl_to_type2JCas = new IdentityHashMap<>();
+
+ private static final Map<ClassLoader, Map<String, JCasClassInfo>> cl_4pears_to_type2JCas = new IdentityHashMap<>();
/**
* precomputed generators for built-in types
@@ -256,17 +258,21 @@ public abstract class FSClassRegistry {
* @param isDoUserJCasLoading always true, left in for experimentation in the future with dynamic generation of JCas classes
* @param cl the class loader. For Pears, is the pear class loader
*/
- static void loadJCasForTSandClassLoader(TypeSystemImpl ts, boolean isDoUserJCasLoading, ClassLoader cl) {
+ private static void loadJCasForTSandClassLoader(
+ TypeSystemImpl ts,
+ boolean isDoUserJCasLoading,
+ ClassLoader cl,
+ Map<ClassLoader, Map<String, JCasClassInfo>> cl2t2j) {
boolean alreadyPartiallyLoaded = false; // true if any JCas types for this class loader have previously been loaded
Map<String, JCasClassInfo> type_to_jcasClassInfo;
- synchronized (cl_to_type2JCas) {
- type_to_jcasClassInfo = cl_to_type2JCas.get(cl);
+ synchronized (cl2t2j) {
+ type_to_jcasClassInfo = cl2t2j.get(cl);
if (null == type_to_jcasClassInfo) {
type_to_jcasClassInfo = new HashMap<>();
- cl_to_type2JCas.put(cl, type_to_jcasClassInfo);
+ cl2t2j.put(cl, type_to_jcasClassInfo);
} else {
alreadyPartiallyLoaded = true;
}
@@ -869,14 +875,18 @@ public abstract class FSClassRegistry {
* @return the generators for that set, as an array indexed by type code
*/
static FsGenerator3[] getGeneratorsForClassLoader(ClassLoader cl, boolean isPear, TypeSystemImpl tsi) {
- synchronized(cl_to_type2JCas) {
+ final Map<ClassLoader, Map<String, JCasClassInfo>> cl2t2j = isPear ? cl_4pears_to_type2JCas : cl_to_type2JCas;
+ synchronized(cl2t2j) {
+// //debug
+// System.out.format("debug loading JCas for type System %s ClassLoader %s, isPear: %b%n",
+// tsi.hashCode(), cl, isPear);
// This is the first time this class loader is being used - load the classes for this type system, or
// This is the first time this class loader is being used with this particular type system
- loadJCasForTSandClassLoader(tsi, true, cl);
+ loadJCasForTSandClassLoader(tsi, true, cl, cl2t2j);
FsGenerator3[] r = new FsGenerator3[tsi.getTypeArraySize()];
- Map<String, JCasClassInfo> t2jcci = cl_to_type2JCas.get(cl);
+ Map<String, JCasClassInfo> t2jcci = cl2t2j.get(cl);
// can't use values alone because many types have the same value (due to copy-down)
for (Entry<String, JCasClassInfo> e : t2jcci.entrySet()) {
TypeImpl ti = tsi.getType(Misc.javaClassName2UimaTypeName(e.getKey()));
Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeSystemImpl.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeSystemImpl.java?rev=1810361&r1=1810360&r2=1810361&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeSystemImpl.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeSystemImpl.java Mon Oct 2 14:32:42 2017
@@ -427,10 +427,21 @@ public class TypeSystemImpl implements T
/**
* Cache for implementing map from type code -> FsGenerator
* Shared by all CASes using this type system
- * Excludes FsGeneratorArrays - those are built-in and constant
+ *
+ * maps from classloader to generator set for non-pears
+ *
*/
private final Map<ClassLoader, FsGenerator3[]> generatorsByClassLoader = new IdentityHashMap<>();
-
+
+ /**
+ * Cache for implementing map from type code -> FsGenerator
+ * Shared by all CASes using this type system
+ *
+ * maps from classloader to generator set for pears
+ *
+ */
+ private final Map<ClassLoader, FsGenerator3[]> generators4pearsByClassLoader = new IdentityHashMap<>();
+
public TypeSystemImpl() {
// set up meta info (TypeImpl) for built-in types
@@ -1341,6 +1352,8 @@ public class TypeSystemImpl implements T
if (null != prevWr) {
TypeSystemImpl prev = prevWr.get();
if (null != prev) {
+ // the following is a no-op if the generators already set up for this class loader
+ prev.getGeneratorsForClassLoader(cl, false);
return prev;
}
}
@@ -2628,11 +2641,12 @@ public class TypeSystemImpl implements T
* @return the generators
*/
public FsGenerator3[] getGeneratorsForClassLoader(ClassLoader cl, boolean isPear) {
- synchronized (generatorsByClassLoader) {
- FsGenerator3[] g = generatorsByClassLoader.get(cl); // a separate map per type system instance
+ Map<ClassLoader, FsGenerator3[]> gByC = isPear ? generators4pearsByClassLoader : generatorsByClassLoader;
+ synchronized (gByC) {
+ FsGenerator3[] g = gByC.get(cl); // a separate map per type system instance
if (g == null) {
g = FSClassRegistry.getGeneratorsForClassLoader(cl, isPear, this);
- generatorsByClassLoader.put(cl, g);
+ gByC.put(cl, g);
}
return g;
}