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 2019/07/08 21:55:15 UTC

svn commit: r1862779 - in /uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima: UimaContext.java analysis_engine/asb/impl/FlowContainer.java cas/impl/CASImpl.java impl/Util.java

Author: schor
Date: Mon Jul  8 21:55:14 2019
New Revision: 1862779

URL: http://svn.apache.org/viewvc?rev=1862779&view=rev
Log:
[UIMA-6057] support running subroutine pipelines using other pipeline's CASs.

Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java?rev=1862779&r1=1862778&r2=1862779&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java Mon Jul  8 21:55:14 2019
@@ -527,6 +527,7 @@ public interface UimaContext {
    * @param <T> the type of the CAS interface (CAS or JCas)
    * 
    * @return an empty CAS. This will be an implementation of <code>aCasInterface</code>.
+   *      The CAS will be unlocked (can be reset) but will have switched Class Loaders if needed.
    */
   public <T extends AbstractCas> T getEmptyCas(Class<T> aCasInterface);
   

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java?rev=1862779&r1=1862778&r2=1862779&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java Mon Jul  8 21:55:14 2019
@@ -109,6 +109,7 @@ public class FlowContainer {
       mFlow.aborted();
     } finally {
       mCAS.restoreClassLoaderUnlockCas();
+      mCAS.restoreClassLoaderUnlockCas();  // this one unlocks the aborted CAS itself
     }
   }
   
@@ -118,6 +119,7 @@ public class FlowContainer {
       return mFlow.continueOnFailure(failedAeKey, failure);
     } finally {
       mCAS.restoreClassLoaderUnlockCas();
+      mCAS.restoreClassLoaderUnlockCas();  // this one unlocks the failed CAS itself
     }
   }
 

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java?rev=1862779&r1=1862778&r2=1862779&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java Mon Jul  8 21:55:14 2019
@@ -37,8 +37,10 @@ import java.nio.FloatBuffer;
 import java.nio.IntBuffer;
 import java.nio.LongBuffer;
 import java.nio.ShortBuffer;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Deque;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -234,6 +236,15 @@ public class CASImpl extends AbstractCas
   // Static classes representing shared instance data
   // - shared data is computed once for all views
 
+  static class SwitchControl {
+    final boolean wasLocked;
+    boolean wasSwitched = false;
+    
+    SwitchControl(boolean wasLocked) {
+      this.wasLocked = wasLocked;
+    }
+  }
+  
   // fields shared among all CASes belong to views of a common base CAS
   private static class SharedViewData {
 
@@ -370,6 +381,8 @@ public class CASImpl extends AbstractCas
     
     private final EnumSet<CasState> casState = EnumSet.noneOf(CasState.class); 
     
+    private final Deque<SwitchControl> switchControl = new ArrayDeque<>();
+    
     private SharedViewData(boolean useFSCache, Heap heap, CASImpl baseCAS, CASMetadata casMetadata) {
       this.useFSCache = useFSCache;
       this.heap = heap;
@@ -386,6 +399,10 @@ public class CASImpl extends AbstractCas
   // package protected to let other things share this info
   final SharedViewData svd; // shared view data
   
+  public boolean isCasLocked() {
+    return ! svd.flushEnabled;
+  }
+  
   void addbackSingle(int fsAddr) {
     svd.fsTobeAddedbackSingle.addback(fsAddr);
     svd.fsTobeAddedbackSingleInUse = false;
@@ -486,7 +503,7 @@ public class CASImpl extends AbstractCas
    *      Internal use Never called Kept because it's in the interface.
    */
   @Override
-public void setCAS(CAS cas) {
+  public void setCAS(CAS cas) {
 
     // this.indexRepository = ((CASImpl)cas).indexRepository; // only for test
     // case, others override later
@@ -1107,7 +1124,7 @@ public TypeSystemMgr getTypeSystemMgr()
 
   @Override
 public void reset() {
-    if (!this.svd.flushEnabled) {
+    if (isCasLocked()) {
       throw new CASAdminException(CASAdminException.FLUSH_DISABLED);
     }
     if (this == this.svd.baseCAS) {
@@ -1196,6 +1213,7 @@ public void reset() {
       this.svd.traceFScreationSb.setLength(0);
     }
     this.svd.componentInfo = null; // https://issues.apache.org/jira/browse/UIMA-5097
+    this.svd.switchControl.clear();
   }
 
   /**
@@ -4406,13 +4424,20 @@ public void setJCasClassLoader(ClassLoad
 
   public void switchClassLoaderLockCasCL(ClassLoader newClassLoader) {
     // lock out CAS functions to which annotator should not have access
+    boolean wasLocked = isCasLocked();
     enableReset(false);
 
-    switchClassLoader(newClassLoader);
+    switchClassLoader(newClassLoader, wasLocked);
   }
 
   // switches ClassLoader but does not lock CAS
-  public void switchClassLoader(ClassLoader newClassLoader) {
+  public void switchClassLoader(ClassLoader newClassLoader, boolean wasLocked) {
+    
+    SwitchControl switchControl = new SwitchControl(wasLocked);
+//    if (wasLocked) {
+//      System.out.println("debug was locked");
+//    }
+    this.svd.switchControl.push(switchControl);
     if (null == newClassLoader) { // is null if no cl set
       return;
     }
@@ -4422,10 +4447,12 @@ public void setJCasClassLoader(ClassLoad
         throw new CASRuntimeException(CASRuntimeException.SWITCH_CLASS_LOADER_NESTED, 
                                       new Object[] {this.svd.previousJCasClassLoader, this.svd.jcasClassLoader, newClassLoader});
       }
-      // System.out.println("Switching to new class loader");
+//      System.out.println("Debug Switching to new class loader " + newClassLoader + ", prev was " + this.svd.previousJCasClassLoader);
       this.svd.jcasClassLoader = newClassLoader;
+      switchControl.wasSwitched = true;
       if (null != this.jcas) {
         this.jcas.switchClassLoader(newClassLoader);
+        
       }
     }
   }
@@ -4437,12 +4464,17 @@ public void setJCasClassLoader(ClassLoad
 
   public void restoreClassLoaderUnlockCas() {
     // unlock CAS functions
-    enableReset(true);
+    
+    boolean empty_switchControl = this.svd.switchControl.isEmpty();
+    SwitchControl switchControl = empty_switchControl ? null :this.svd.switchControl.pop();
+    if (empty_switchControl || ! switchControl.wasLocked) {
+      enableReset(true);
+    }
     // this might be called without the switch ever being called
     if (null == this.svd.previousJCasClassLoader) {
       return;
     }
-    if (this.svd.previousJCasClassLoader != this.svd.jcasClassLoader) {
+    if ((empty_switchControl || switchControl.wasSwitched) && this.svd.previousJCasClassLoader != this.svd.jcasClassLoader) {
       // System.out.println("Switching back to previous class loader");
       this.svd.jcasClassLoader = this.svd.previousJCasClassLoader;
       if (null != this.jcas) {
@@ -5429,7 +5461,7 @@ public Iterator<CAS> getViewIterator(Str
    */
   @Override
 public Marker createMarker() {
-    if (!this.svd.flushEnabled) {
+    if (isCasLocked()) {
 	  throw new CASAdminException(CASAdminException.FLUSH_DISABLED);
   	}
   	this.svd.trackingMark = new MarkerImpl(this.getHeap().getNextId(), 

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java?rev=1862779&r1=1862778&r2=1862779&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java Mon Jul  8 21:55:14 2019
@@ -85,7 +85,8 @@ public class Util {
     // This cas will be unlocked and its class loader restored when the
     //   next() method returns it
     // Insure the same view is passed for switching/restoring  https://issues.apache.org/jira/browse/UIMA-2211
-    ci.switchClassLoader(resourceManager.getExtensionClassLoader());    
+    boolean wasLocked = ci.isCasLocked();
+    ci.switchClassLoader(resourceManager.getExtensionClassLoader(), wasLocked);    
     return r;
   }