You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2020/01/17 15:48:39 UTC

[commons-jexl] 02/02: JEXL-320: remove dependency on Unsafe in test Task #JEXL-320 - "mvn test" fails with COMPILATION ERROR in SynchronizedArithmetic.java on Java 11

This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit de8eb7d2897ebcbfa7d4ff61ed5fce5fa42e20f7
Author: henrib <he...@apache.org>
AuthorDate: Fri Jan 17 16:45:01 2020 +0100

    JEXL-320: remove dependency on Unsafe in test
    Task #JEXL-320 - "mvn test" fails with COMPILATION ERROR in SynchronizedArithmetic.java on Java 11
---
 .../commons/jexl3/SynchronizedArithmetic.java      | 88 ++++++++++++++++------
 .../commons/jexl3/SynchronizedOverloadsTest.java   |  2 +-
 2 files changed, 66 insertions(+), 24 deletions(-)

diff --git a/src/test/java/org/apache/commons/jexl3/SynchronizedArithmetic.java b/src/test/java/org/apache/commons/jexl3/SynchronizedArithmetic.java
index 9938b2b..7c897c0 100644
--- a/src/test/java/org/apache/commons/jexl3/SynchronizedArithmetic.java
+++ b/src/test/java/org/apache/commons/jexl3/SynchronizedArithmetic.java
@@ -16,12 +16,13 @@
  */
 package org.apache.commons.jexl3;
 
-import java.lang.reflect.Field;
+import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.concurrent.atomic.AtomicInteger;
-import sun.misc.Unsafe;
+//import java.lang.reflect.Field;
+//import sun.misc.Unsafe;
 
 /**
  *
@@ -60,7 +61,6 @@ public class SynchronizedArithmetic extends JexlArithmetic {
          * @param o the monitored object
          */
         protected void monitorEnter(Object o) {
-            UNSAFE.monitorEnter(o);
             enters.incrementAndGet();
         }
 
@@ -69,7 +69,6 @@ public class SynchronizedArithmetic extends JexlArithmetic {
          * @param o the monitored object
          */
         protected void monitorExit(Object o) {
-            UNSAFE.monitorExit(o);
             exits.incrementAndGet();
         }
 
@@ -94,32 +93,75 @@ public class SynchronizedArithmetic extends JexlArithmetic {
     /**
      * You should know better than to use this...
      */
-    private static Unsafe UNSAFE;
-    static {
-        try {
-            Field f = Unsafe.class.getDeclaredField("theUnsafe");
-            f.setAccessible(true);
-            UNSAFE = (Unsafe) f.get(null);
-        } catch (Exception e) {
-            UNSAFE = null;
-        }
-    }
-
+//    private static Unsafe UNSAFE;
+//    static {
+//        try {
+//            Field f = Unsafe.class.getDeclaredField("theUnsafe");
+//            f.setAccessible(true);
+//            UNSAFE = (Unsafe) f.get(null);
+//        } catch (Exception e) {
+//            UNSAFE = null;
+//        }
+//    }
+//
+//    /**
+//     * Using the unsafe to enter & exit object intrinsic monitors.
+//     */
+//    static class UnsafeMonitor extends Monitor {
+//        @Override protected void monitorEnter(Object o) {
+//            UNSAFE.monitorEnter(o);
+//            super.monitorEnter(o);
+//        }
+//
+//        @Override protected void monitorExit(Object o) {
+//            UNSAFE.monitorExit(o);
+//            super.monitorExit(o);
+//        }
+//    }
+    
     /**
-     * Using the unsafe to enter & exit object intrinsic monitors.
+     * Crude monitor replacement...
      */
-    static class UnsafeMonitor extends Monitor {
-        @Override protected void monitorEnter(Object o) {
-            UNSAFE.monitorEnter(o);
-            super.monitorEnter(o);
+    static class SafeMonitor extends Monitor {
+         private final Map<Object, Object> monitored = new IdentityHashMap<Object, Object>();
+
+        @Override
+        protected void monitorEnter(Object o) {
+            Object guard;
+            try {
+                while (true) {
+                    synchronized (monitored) {
+                        guard = monitored.get(o);
+                        if (guard == null) {
+                            guard = new Object();
+                            monitored.put(o, guard);
+                            super.monitorEnter(o);
+                            break;
+                        }
+                    }
+                    synchronized (guard) {
+                        guard.wait();
+                    }
+                }
+            } catch (InterruptedException xint) {
+                // oops
+            }
         }
 
         @Override protected void monitorExit(Object o) {
-            UNSAFE.monitorExit(o);
-            super.monitorExit(o);
+            final Object guard;
+            synchronized(monitored) {
+                guard = monitored.remove(o);
+            }
+            if (guard != null) {
+                synchronized(guard) {
+                    guard.notifyAll();
+                }
+                super.monitorExit(o);
+            }
         }
     }
-
+    
     /**
      * An iterator that implements Closeable (at least implements a close method)
      * and uses monitors to protect iteration.
diff --git a/src/test/java/org/apache/commons/jexl3/SynchronizedOverloadsTest.java b/src/test/java/org/apache/commons/jexl3/SynchronizedOverloadsTest.java
index cf98bce..769da63 100644
--- a/src/test/java/org/apache/commons/jexl3/SynchronizedOverloadsTest.java
+++ b/src/test/java/org/apache/commons/jexl3/SynchronizedOverloadsTest.java
@@ -64,7 +64,7 @@ public class SynchronizedOverloadsTest extends JexlTestCase {
 
     @Test
     public void testUnsafeMonitor() throws Exception {
-        SynchronizedArithmetic.Monitor monitor = new SynchronizedArithmetic.UnsafeMonitor();
+        SynchronizedArithmetic.Monitor monitor = new SynchronizedArithmetic.SafeMonitor();
         Map<String, Object> foo = new TreeMap<String, Object>();
         foo.put("one", 1);
         foo.put("two", 2);