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/09 17:28:31 UTC
svn commit: r1862829 - in
/uima/uv3/uimaj-v3/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: Tue Jul 9 17:28:30 2019
New Revision: 1862829
URL: http://svn.apache.org/viewvc?rev=1862829&view=rev
Log:
[UIMA-6057] merge from v2, also put back in the class loader switch when getting an empty CAS, in case some JCas ops are done using it.
Modified:
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java (contents, props changed)
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java (contents, props changed)
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/impl/Util.java (contents, props changed)
Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java?rev=1862829&r1=1862828&r2=1862829&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java Tue Jul 9 17:28:30 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);
Propchange: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Tue Jul 9 17:28:30 2019
@@ -0,0 +1,8 @@
+/incubator/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:932400-933272
+/uima/uimaj/branches/2.6.0-json/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:1616936-1617592
+/uima/uimaj/branches/depend-on-july-9-build-tools/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:963167-964468
+/uima/uimaj/branches/depend-on-parent-pom-4/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:961329-961745
+/uima/uimaj/branches/filteredCompress-uima-2498/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:1436573-1462257
+/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:933273-944396
+/uima/uimaj/branches/test-parent-pom-6/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:1024030
+/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:1690273-1862818
Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java?rev=1862829&r1=1862828&r2=1862829&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java Tue Jul 9 17:28:30 2019
@@ -109,6 +109,8 @@ public class FlowContainer {
mFlow.aborted();
} finally {
mCAS.restoreClassLoaderUnlockCas();
+ // https://issues.apache.org/jira/browse/UIMA-6057
+ mCAS.restoreClassLoaderUnlockCas(); // this one unlocks the aborted CAS itself
}
}
@@ -118,6 +120,8 @@ public class FlowContainer {
return mFlow.continueOnFailure(failedAeKey, failure);
} finally {
mCAS.restoreClassLoaderUnlockCas();
+ // https://issues.apache.org/jira/browse/UIMA-6057
+ mCAS.restoreClassLoaderUnlockCas(); // this one unlocks the failed CAS itself
}
}
Propchange: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Tue Jul 9 17:28:30 2019
@@ -0,0 +1,8 @@
+/incubator/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:932400-933272
+/uima/uimaj/branches/2.6.0-json/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:1616936-1617592
+/uima/uimaj/branches/depend-on-july-9-build-tools/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:963167-964468
+/uima/uimaj/branches/depend-on-parent-pom-4/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:961329-961745
+/uima/uimaj/branches/filteredCompress-uima-2498/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:1436573-1462257
+/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:933273-944396
+/uima/uimaj/branches/test-parent-pom-6/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:1024030
+/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:1690273-1862825
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=1862829&r1=1862828&r2=1862829&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 Tue Jul 9 17:28:30 2019
@@ -34,11 +34,13 @@ import java.lang.invoke.MutableCallSite;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
+import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection;
import java.util.Collections;
+import java.util.Deque;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
@@ -310,7 +312,22 @@ public class CASImpl extends AbstractCas
return ((FsChange)obj).fs._id == fs._id;
}
}
+
+ /**
+ * Instances are put into a Stack, to remember previous state to switch back to,
+ * when switching class loaders and locking the CAS
+ * https://issues.apache.org/jira/browse/UIMA-6057
+ */
+ 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
static class SharedViewData {
/**
@@ -566,6 +583,13 @@ public class CASImpl extends AbstractCas
*/
private boolean isId2Fs;
+ /**
+ * a stack used to remember and restore previous state of cas lock and class loaders
+ * when switching classloaders and locking the cas
+ * https://issues.apache.org/jira/browse/UIMA-6057
+ */
+ private final Deque<SwitchControl> switchControl = new ArrayDeque<>();
+
/******************************************************************************************
* C A S S T A T E management *
* Cas state is implemented in a way to allow the Java to efficiently *
@@ -806,8 +830,9 @@ public class CASImpl extends AbstractCas
traceFSid = 0;
if (traceFSs) {
traceFScreationSb.setLength(0);
- }
+ }
componentInfo = null; // https://issues.apache.org/jira/browse/UIMA-5097
+ switchControl.clear(); // https://issues.apache.org/jira/browse/UIMA-6057
}
private void flushIndexRepositoriesAllViews() {
@@ -852,7 +877,12 @@ public class CASImpl extends AbstractCas
trackingMarkList = null;
}
- void switchClassLoader(ClassLoader newClassLoader) {
+ // switches ClassLoader but does not lock CAS
+ void switchClassLoader(ClassLoader newClassLoader, boolean wasLocked) {
+ // https://issues.apache.org/jira/browse/UIMA-6057
+ SwitchControl switchControlInstance = new SwitchControl(wasLocked);
+ switchControl.push(switchControlInstance);
+
if (null == newClassLoader) { // is null if no cl set
return;
}
@@ -865,6 +895,7 @@ public class CASImpl extends AbstractCas
// System.out.println("Switching to new class loader");
previousJCasClassLoader = jcasClassLoader;
jcasClassLoader = newClassLoader;
+ switchControlInstance.wasSwitched = true;
generators = tsi.getGeneratorsForClassLoader(newClassLoader, true); // true - isPear
assert null == id2tramp; // is null outside of a pear
@@ -878,15 +909,18 @@ public class CASImpl extends AbstractCas
}
}
- void restoreClassLoader() {
+ void restoreClassLoader(boolean empty_switchControl, SwitchControl switchControlInstance) {
if (null == previousJCasClassLoader) {
return;
}
- // System.out.println("Switching back to previous class loader");
- jcasClassLoader = previousJCasClassLoader;
- previousJCasClassLoader = null;
- generators = baseGenerators;
- id2tramp = null;
+
+ if ((empty_switchControl || switchControlInstance.wasSwitched) && previousJCasClassLoader != jcasClassLoader) {
+ // System.out.println("Switching back to previous class loader");
+ jcasClassLoader = previousJCasClassLoader;
+ previousJCasClassLoader = null;
+ generators = baseGenerators;
+ id2tramp = null;
+ }
}
/**
@@ -1034,6 +1068,11 @@ public class CASImpl extends AbstractCas
// package protected to let other things share this info
final SharedViewData svd; // shared view data
+ // public only for cross package access
+ public boolean isCasLocked() {
+ return ! svd.flushEnabled;
+ }
+
/** The index repository. Referenced by XmiCasSerializer */
FSIndexRepositoryImpl indexRepository;
@@ -1839,7 +1878,7 @@ public class CASImpl extends AbstractCas
@Override
public void reset() {
- if (!this.svd.flushEnabled) {
+ if (isCasLocked()) {
throw new CASAdminException(CASAdminException.FLUSH_DISABLED);
}
if (this == this.svd.baseCAS) {
@@ -3814,6 +3853,10 @@ public JCasImpl getJCasImpl() {
public void setJCasClassLoader(ClassLoader classLoader) {
this.svd.jcasClassLoader = classLoader;
}
+
+ public void switchClassLoader(ClassLoader newClassLoader, boolean wasLocked) {
+ this.svd.switchClassLoader(newClassLoader, wasLocked);
+ }
// Internal use only, public for cross package use
// Assumes: The JCasClassLoader for a CAS is set up initially when the CAS is
@@ -3833,9 +3876,10 @@ public JCasImpl getJCasImpl() {
}
public void switchClassLoaderLockCasCL(ClassLoader newClassLoader) {
+ boolean wasLocked = isCasLocked();
// lock out CAS functions to which annotator should not have access
enableReset(false);
- svd.switchClassLoader(newClassLoader);
+ svd.switchClassLoader(newClassLoader, wasLocked);
}
// // internal use, public for cross-package ref
@@ -3844,10 +3888,14 @@ public JCasImpl getJCasImpl() {
// }
public void restoreClassLoaderUnlockCas() {
- // unlock CAS functions
- enableReset(true);
+ boolean empty_switchControl = this.svd.switchControl.isEmpty();
+ SwitchControl switchControlInstance = empty_switchControl ? null :this.svd.switchControl.pop();
+ if (empty_switchControl || ! switchControlInstance.wasLocked) {
+ // unlock CAS functions
+ enableReset(true);
+ }
// this might be called without the switch ever being called
- svd.restoreClassLoader();
+ svd.restoreClassLoader(empty_switchControl, switchControlInstance);
}
@@ -4832,8 +4880,8 @@ public JCasImpl getJCasImpl() {
*/
@Override
public Marker createMarker() {
- if (!this.svd.flushEnabled) {
- throw new CASAdminException(CASAdminException.FLUSH_DISABLED);
+ if (isCasLocked()) {
+ throw new CASAdminException(CASAdminException.FLUSH_DISABLED);
}
this.svd.trackingMark = new MarkerImpl(this.getLastUsedFsId() + 1,
this);
Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java?rev=1862829&r1=1862828&r2=1862829&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java Tue Jul 9 17:28:30 2019
@@ -88,7 +88,11 @@ 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());
+ // putting back the switch of class loaders for Pears and other
+ // possible structures. Corresponds to v2 impl 7/2019
+ // See https://issues.apache.org/jira/browse/UIMA-5030
+ boolean wasLocked = ci.isCasLocked();
+ ci.switchClassLoader(resourceManager.getExtensionClassLoader(), wasLocked);
return r;
}
Propchange: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Tue Jul 9 17:28:30 2019
@@ -0,0 +1,8 @@
+/incubator/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:932400-933272
+/uima/uimaj/branches/2.6.0-json/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:1616936-1617592
+/uima/uimaj/branches/depend-on-july-9-build-tools/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:963167-964468
+/uima/uimaj/branches/depend-on-parent-pom-4/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:961329-961745
+/uima/uimaj/branches/filteredCompress-uima-2498/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:1436573-1462257
+/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:933273-944396
+/uima/uimaj/branches/test-parent-pom-6/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:1024030
+/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:1690273-1862818