1.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedQueue.java Sat Mar 19 10:46:31 2016 +0100
1.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedQueue.java Sat Mar 19 12:51:03 2016 +0100
1.3 @@ -184,38 +184,27 @@
1.4 * only be seen after publication via casNext.
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 - }
1.28 -
1.29 - // Unsafe mechanics
1.30 -
1.31 - private static final sun.misc.Unsafe UNSAFE;
1.32 - private static final long itemOffset;
1.33 - private static final long nextOffset;
1.34 -
1.35 - static {
1.36 - try {
1.37 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.38 - Class k = Node.class;
1.39 - itemOffset = UNSAFE.objectFieldOffset
1.40 - (k.getDeclaredField("item"));
1.41 - nextOffset = UNSAFE.objectFieldOffset
1.42 - (k.getDeclaredField("next"));
1.43 - } catch (Exception e) {
1.44 - throw new Error(e);
1.45 + if (next == cmp) {
1.46 + next = val;
1.47 + return true;
1.48 }
1.49 + return false;
1.50 }
1.51 }
1.52
1.53 @@ -808,28 +797,19 @@
1.54 }
1.55
1.56 private boolean casTail(Node<E> cmp, Node<E> val) {
1.57 - return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
1.58 + if (tail == cmp) {
1.59 + tail = val;
1.60 + return true;
1.61 + }
1.62 + return false;
1.63 }
1.64
1.65 private boolean casHead(Node<E> cmp, Node<E> val) {
1.66 - return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
1.67 + if (head == cmp) {
1.68 + head = val;
1.69 + return true;
1.70 + }
1.71 + return false;
1.72 }
1.73
1.74 - // Unsafe mechanics
1.75 -
1.76 - private static final sun.misc.Unsafe UNSAFE;
1.77 - private static final long headOffset;
1.78 - private static final long tailOffset;
1.79 - static {
1.80 - try {
1.81 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.82 - Class k = ConcurrentLinkedQueue.class;
1.83 - headOffset = UNSAFE.objectFieldOffset
1.84 - (k.getDeclaredField("head"));
1.85 - tailOffset = UNSAFE.objectFieldOffset
1.86 - (k.getDeclaredField("tail"));
1.87 - } catch (Exception e) {
1.88 - throw new Error(e);
1.89 - }
1.90 - }
1.91 }