1.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java Sat Mar 19 10:46:31 2016 +0100
1.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java Sat Mar 19 12:51:03 2016 +0100
1.3 @@ -302,49 +302,39 @@
1.4 * only be seen after publication via casNext or casPrev.
1.5 */
1.6 Node(E item) {
1.7 - UNSAFE.putObject(this, itemOffset, item);
1.8 + this.item = item;
1.9 }
1.10
1.11 boolean casItem(E cmp, E val) {
1.12 - return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
1.13 + if (item == cmp) {
1.14 + item = val;
1.15 + return true;
1.16 + }
1.17 + return false;
1.18 }
1.19
1.20 void lazySetNext(Node<E> val) {
1.21 - UNSAFE.putOrderedObject(this, nextOffset, val);
1.22 + this.next = val;
1.23 }
1.24
1.25 boolean casNext(Node<E> cmp, Node<E> val) {
1.26 - return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
1.27 + if (next == cmp) {
1.28 + next = val;
1.29 + return true;
1.30 + }
1.31 + return false;
1.32 }
1.33
1.34 void lazySetPrev(Node<E> val) {
1.35 - UNSAFE.putOrderedObject(this, prevOffset, val);
1.36 + this.prev = val;
1.37 }
1.38
1.39 boolean casPrev(Node<E> cmp, Node<E> val) {
1.40 - return UNSAFE.compareAndSwapObject(this, prevOffset, cmp, val);
1.41 - }
1.42 -
1.43 - // Unsafe mechanics
1.44 -
1.45 - private static final sun.misc.Unsafe UNSAFE;
1.46 - private static final long prevOffset;
1.47 - private static final long itemOffset;
1.48 - private static final long nextOffset;
1.49 -
1.50 - static {
1.51 - try {
1.52 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.53 - Class k = Node.class;
1.54 - prevOffset = UNSAFE.objectFieldOffset
1.55 - (k.getDeclaredField("prev"));
1.56 - itemOffset = UNSAFE.objectFieldOffset
1.57 - (k.getDeclaredField("item"));
1.58 - nextOffset = UNSAFE.objectFieldOffset
1.59 - (k.getDeclaredField("next"));
1.60 - } catch (Exception e) {
1.61 - throw new Error(e);
1.62 + if (prev == cmp) {
1.63 + prev = val;
1.64 + return true;
1.65 }
1.66 + return false;
1.67 }
1.68 }
1.69
1.70 @@ -1438,32 +1428,25 @@
1.71
1.72
1.73 private boolean casHead(Node<E> cmp, Node<E> val) {
1.74 - return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
1.75 + if (head == cmp) {
1.76 + head = val;
1.77 + return true;
1.78 + }
1.79 + return false;
1.80 }
1.81
1.82 private boolean casTail(Node<E> cmp, Node<E> val) {
1.83 - return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
1.84 + if (tail == cmp) {
1.85 + tail = val;
1.86 + return true;
1.87 + }
1.88 + return false;
1.89 }
1.90
1.91 - // Unsafe mechanics
1.92 -
1.93 - private static final sun.misc.Unsafe UNSAFE;
1.94 - private static final long headOffset;
1.95 - private static final long tailOffset;
1.96 static {
1.97 PREV_TERMINATOR = new Node<Object>();
1.98 PREV_TERMINATOR.next = PREV_TERMINATOR;
1.99 NEXT_TERMINATOR = new Node<Object>();
1.100 NEXT_TERMINATOR.prev = NEXT_TERMINATOR;
1.101 - try {
1.102 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.103 - Class k = ConcurrentLinkedDeque.class;
1.104 - headOffset = UNSAFE.objectFieldOffset
1.105 - (k.getDeclaredField("head"));
1.106 - tailOffset = UNSAFE.objectFieldOffset
1.107 - (k.getDeclaredField("tail"));
1.108 - } catch (Exception e) {
1.109 - throw new Error(e);
1.110 - }
1.111 }
1.112 }