diff -r 212417b74b72 -r bfaf3300b7ba rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java Sat Mar 19 10:46:31 2016 +0100 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java Sat Mar 19 12:51:03 2016 +0100 @@ -35,7 +35,6 @@ package java.util.concurrent; import java.util.*; -import java.util.concurrent.atomic.*; /** * A scalable concurrent {@link ConcurrentNavigableMap} implementation. @@ -379,7 +378,11 @@ * compareAndSet head node */ private boolean casHead(HeadIndex cmp, HeadIndex val) { - return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val); + if (head == cmp) { + head = val; + return true; + } + return false; } /* ---------------- Nodes -------------- */ @@ -422,14 +425,22 @@ * compareAndSet value field */ boolean casValue(Object cmp, Object val) { - return UNSAFE.compareAndSwapObject(this, valueOffset, cmp, val); + if (value == cmp) { + value = val; + return true; + } + return false; } /** * compareAndSet next field */ boolean casNext(Node cmp, Node val) { - return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val); + if (next == cmp) { + next = val; + return true; + } + return false; } /** @@ -507,25 +518,6 @@ return null; return new AbstractMap.SimpleImmutableEntry(key, v); } - - // UNSAFE mechanics - - private static final sun.misc.Unsafe UNSAFE; - private static final long valueOffset; - private static final long nextOffset; - - static { - try { - UNSAFE = sun.misc.Unsafe.getUnsafe(); - Class k = Node.class; - valueOffset = UNSAFE.objectFieldOffset - (k.getDeclaredField("value")); - nextOffset = UNSAFE.objectFieldOffset - (k.getDeclaredField("next")); - } catch (Exception e) { - throw new Error(e); - } - } } /* ---------------- Indexing -------------- */ @@ -555,7 +547,11 @@ * compareAndSet right field */ final boolean casRight(Index cmp, Index val) { - return UNSAFE.compareAndSwapObject(this, rightOffset, cmp, val); + if (right == cmp) { + right = val; + return true; + } + return false; } /** @@ -590,20 +586,6 @@ final boolean unlink(Index succ) { return !indexesDeletedNode() && casRight(succ, succ.right); } - - // Unsafe mechanics - private static final sun.misc.Unsafe UNSAFE; - private static final long rightOffset; - static { - try { - UNSAFE = sun.misc.Unsafe.getUnsafe(); - Class k = Index.class; - rightOffset = UNSAFE.objectFieldOffset - (k.getDeclaredField("right")); - } catch (Exception e) { - throw new Error(e); - } - } } /* ---------------- Head nodes -------------- */ @@ -3102,18 +3084,4 @@ } } } - - // Unsafe mechanics - private static final sun.misc.Unsafe UNSAFE; - private static final long headOffset; - static { - try { - UNSAFE = sun.misc.Unsafe.getUnsafe(); - Class k = ConcurrentSkipListMap.class; - headOffset = UNSAFE.objectFieldOffset - (k.getDeclaredField("head")); - } catch (Exception e) { - throw new Error(e); - } - } }