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