Author: schor
Date: Thu May  9 21:05:19 2019
New Revision: 1859040

URL: http://svn.apache.org/viewvc?rev=1859040&view=rev
Log:
[UIMA-6038] improve cas reset

Modified:
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.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=1859040&r1=1859039&r2=1859040&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
 Thu May  9 21:05:19 2019
@@ -594,9 +594,15 @@ public class CASImpl extends AbstractCas
     
     private volatile Thread current_one_thread_access = null;
     
-    private void updateCallSite(MutableCallSite c, MethodHandle mh, 
MutableCallSite[] cs) {
-      c.setTarget(mh);
-      MutableCallSite.syncAll(cs);
+    private void updateCallSite(boolean desired_state, MethodHandle tester, 
MutableCallSite c, MethodHandle mh, MutableCallSite[] cs) {
+      try {
+        if (((boolean)tester.invokeExact()) != desired_state) {
+          c.setTarget(mh);
+          MutableCallSite.syncAll(cs);
+        }
+      } catch (Throwable e) {
+        Misc.internalError(e);
+      }
     }
     
     private synchronized boolean setCasState(CasState state, Thread thread) {
@@ -609,13 +615,19 @@ public class CASImpl extends AbstractCas
          {
             break;  // ignore readonly if no-access is set
         }
-          updateCallSite(is_updatable_callsite, mh_return_false, 
is_updatable_callsites);
+          updateCallSite(false, is_updatable, is_updatable_callsite, 
mh_return_false, is_updatable_callsites);
           break;
         case NO_ACCESS:
           current_one_thread_access = thread;
           MethodHandle mh = CasState.produce_one_thread_access_test(thread);
-          updateCallSite(is_updatable_callsite, mh, is_updatable_callsites);
-          updateCallSite(is_readable_callsite, mh, is_readable_callsites);
+          boolean b = true; // value ignored, needed to avoid compile warning
+          try {
+            b = (boolean) mh.invokeExact();
+          } catch (Throwable e) {
+            Misc.internalError(e);
+          }
+          updateCallSite(b, is_updatable, is_updatable_callsite, mh, 
is_updatable_callsites);
+          updateCallSite(b, is_readable, is_readable_callsite, mh, 
is_readable_callsites);
           break;
         default:
         }
@@ -631,12 +643,12 @@ public class CASImpl extends AbstractCas
           if (casState.contains(CasState.NO_ACCESS)) {
             break;
         } 
-          updateCallSite(is_updatable_callsite, mh_return_true, 
is_updatable_callsites);
+          updateCallSite(true, is_updatable, is_updatable_callsite, 
mh_return_true, is_updatable_callsites);
           break;
         case NO_ACCESS:
           current_one_thread_access = null;
-          updateCallSite(is_updatable_callsite, mh_return_true, 
is_updatable_callsites);
-          updateCallSite(is_readable_callsite, mh_return_true, 
is_readable_callsites);
+          updateCallSite(true, is_updatable, is_updatable_callsite, 
mh_return_true, is_updatable_callsites);
+          updateCallSite(true, is_readable, is_readable_callsite, 
mh_return_true, is_readable_callsites);
           break;
         default:
         }
@@ -716,8 +728,8 @@ public class CASImpl extends AbstractCas
       emptyBooleanArray = null;
   
       current_one_thread_access = null;
-      updateCallSite(is_updatable_callsite, mh_return_true, 
is_updatable_callsites);
-      updateCallSite(is_readable_callsite, mh_return_true, 
is_readable_callsites);
+      updateCallSite(true, is_updatable, is_updatable_callsite, 
mh_return_true, is_updatable_callsites);
+      updateCallSite(true, is_readable, is_readable_callsite, mh_return_true, 
is_readable_callsites);
       
       clearNonSharedInstanceData();
       


Reply via email to