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;
     }