1.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java Sat Mar 19 10:46:31 2016 +0100
1.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java Sat Mar 19 12:51:03 2016 +0100
1.3 @@ -35,7 +35,6 @@
1.4
1.5 package java.util.concurrent;
1.6 import java.util.*;
1.7 -import java.util.concurrent.atomic.*;
1.8
1.9 /**
1.10 * A scalable concurrent {@link ConcurrentNavigableMap} implementation.
1.11 @@ -379,7 +378,11 @@
1.12 * compareAndSet head node
1.13 */
1.14 private boolean casHead(HeadIndex<K,V> cmp, HeadIndex<K,V> val) {
1.15 - return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
1.16 + if (head == cmp) {
1.17 + head = val;
1.18 + return true;
1.19 + }
1.20 + return false;
1.21 }
1.22
1.23 /* ---------------- Nodes -------------- */
1.24 @@ -422,14 +425,22 @@
1.25 * compareAndSet value field
1.26 */
1.27 boolean casValue(Object cmp, Object val) {
1.28 - return UNSAFE.compareAndSwapObject(this, valueOffset, cmp, val);
1.29 + if (value == cmp) {
1.30 + value = val;
1.31 + return true;
1.32 + }
1.33 + return false;
1.34 }
1.35
1.36 /**
1.37 * compareAndSet next field
1.38 */
1.39 boolean casNext(Node<K,V> cmp, Node<K,V> val) {
1.40 - return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
1.41 + if (next == cmp) {
1.42 + next = val;
1.43 + return true;
1.44 + }
1.45 + return false;
1.46 }
1.47
1.48 /**
1.49 @@ -507,25 +518,6 @@
1.50 return null;
1.51 return new AbstractMap.SimpleImmutableEntry<K,V>(key, v);
1.52 }
1.53 -
1.54 - // UNSAFE mechanics
1.55 -
1.56 - private static final sun.misc.Unsafe UNSAFE;
1.57 - private static final long valueOffset;
1.58 - private static final long nextOffset;
1.59 -
1.60 - static {
1.61 - try {
1.62 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.63 - Class k = Node.class;
1.64 - valueOffset = UNSAFE.objectFieldOffset
1.65 - (k.getDeclaredField("value"));
1.66 - nextOffset = UNSAFE.objectFieldOffset
1.67 - (k.getDeclaredField("next"));
1.68 - } catch (Exception e) {
1.69 - throw new Error(e);
1.70 - }
1.71 - }
1.72 }
1.73
1.74 /* ---------------- Indexing -------------- */
1.75 @@ -555,7 +547,11 @@
1.76 * compareAndSet right field
1.77 */
1.78 final boolean casRight(Index<K,V> cmp, Index<K,V> val) {
1.79 - return UNSAFE.compareAndSwapObject(this, rightOffset, cmp, val);
1.80 + if (right == cmp) {
1.81 + right = val;
1.82 + return true;
1.83 + }
1.84 + return false;
1.85 }
1.86
1.87 /**
1.88 @@ -590,20 +586,6 @@
1.89 final boolean unlink(Index<K,V> succ) {
1.90 return !indexesDeletedNode() && casRight(succ, succ.right);
1.91 }
1.92 -
1.93 - // Unsafe mechanics
1.94 - private static final sun.misc.Unsafe UNSAFE;
1.95 - private static final long rightOffset;
1.96 - static {
1.97 - try {
1.98 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.99 - Class k = Index.class;
1.100 - rightOffset = UNSAFE.objectFieldOffset
1.101 - (k.getDeclaredField("right"));
1.102 - } catch (Exception e) {
1.103 - throw new Error(e);
1.104 - }
1.105 - }
1.106 }
1.107
1.108 /* ---------------- Head nodes -------------- */
1.109 @@ -3102,18 +3084,4 @@
1.110 }
1.111 }
1.112 }
1.113 -
1.114 - // Unsafe mechanics
1.115 - private static final sun.misc.Unsafe UNSAFE;
1.116 - private static final long headOffset;
1.117 - static {
1.118 - try {
1.119 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.120 - Class k = ConcurrentSkipListMap.class;
1.121 - headOffset = UNSAFE.objectFieldOffset
1.122 - (k.getDeclaredField("head"));
1.123 - } catch (Exception e) {
1.124 - throw new Error(e);
1.125 - }
1.126 - }
1.127 }