1.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/LinkedTransferQueue.java Sat Mar 19 10:46:31 2016 +0100
1.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/LinkedTransferQueue.java Sat Mar 19 12:51:03 2016 +0100
1.3 @@ -408,8 +408,7 @@
1.4 */
1.5
1.6 /** True if on multiprocessor */
1.7 - private static final boolean MP =
1.8 - Runtime.getRuntime().availableProcessors() > 1;
1.9 + private static final boolean MP = false;
1.10
1.11 /**
1.12 * The number of times to spin (with randomly interspersed calls
1.13 @@ -453,12 +452,19 @@
1.14
1.15 // CAS methods for fields
1.16 final boolean casNext(Node cmp, Node val) {
1.17 - return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
1.18 + if (next == cmp) {
1.19 + next = val;
1.20 + return true;
1.21 + }
1.22 + return false;
1.23 }
1.24
1.25 final boolean casItem(Object cmp, Object val) {
1.26 - // assert cmp == null || cmp.getClass() != Node.class;
1.27 - return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
1.28 + if (item == cmp) {
1.29 + item = val;
1.30 + return true;
1.31 + }
1.32 + return false;
1.33 }
1.34
1.35 /**
1.36 @@ -466,7 +472,7 @@
1.37 * only be seen after publication via casNext.
1.38 */
1.39 Node(Object item, boolean isData) {
1.40 - UNSAFE.putObject(this, itemOffset, item); // relaxed write
1.41 + this.item = item;
1.42 this.isData = isData;
1.43 }
1.44
1.45 @@ -475,7 +481,7 @@
1.46 * only after CASing head field, so uses relaxed write.
1.47 */
1.48 final void forgetNext() {
1.49 - UNSAFE.putObject(this, nextOffset, this);
1.50 + this.next = this;
1.51 }
1.52
1.53 /**
1.54 @@ -488,8 +494,8 @@
1.55 * else we don't care).
1.56 */
1.57 final void forgetContents() {
1.58 - UNSAFE.putObject(this, itemOffset, this);
1.59 - UNSAFE.putObject(this, waiterOffset, null);
1.60 + this.item = this;
1.61 + this.waiter = null;
1.62 }
1.63
1.64 /**
1.65 @@ -533,26 +539,6 @@
1.66 }
1.67
1.68 private static final long serialVersionUID = -3375979862319811754L;
1.69 -
1.70 - // Unsafe mechanics
1.71 - private static final sun.misc.Unsafe UNSAFE;
1.72 - private static final long itemOffset;
1.73 - private static final long nextOffset;
1.74 - private static final long waiterOffset;
1.75 - static {
1.76 - try {
1.77 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.78 - Class k = Node.class;
1.79 - itemOffset = UNSAFE.objectFieldOffset
1.80 - (k.getDeclaredField("item"));
1.81 - nextOffset = UNSAFE.objectFieldOffset
1.82 - (k.getDeclaredField("next"));
1.83 - waiterOffset = UNSAFE.objectFieldOffset
1.84 - (k.getDeclaredField("waiter"));
1.85 - } catch (Exception e) {
1.86 - throw new Error(e);
1.87 - }
1.88 - }
1.89 }
1.90
1.91 /** head of the queue; null until first enqueue */
1.92 @@ -566,15 +552,27 @@
1.93
1.94 // CAS methods for fields
1.95 private boolean casTail(Node cmp, Node val) {
1.96 - return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
1.97 + if (tail == cmp) {
1.98 + tail = val;
1.99 + return true;
1.100 + }
1.101 + return false;
1.102 }
1.103
1.104 private boolean casHead(Node cmp, Node val) {
1.105 - return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
1.106 + if (head == cmp) {
1.107 + head = val;
1.108 + return true;
1.109 + }
1.110 + return false;
1.111 }
1.112
1.113 private boolean casSweepVotes(int cmp, int val) {
1.114 - return UNSAFE.compareAndSwapInt(this, sweepVotesOffset, cmp, val);
1.115 + if (sweepVotes == cmp) {
1.116 + sweepVotes = val;
1.117 + return true;
1.118 + }
1.119 + return false;
1.120 }
1.121
1.122 /*
1.123 @@ -1327,25 +1325,4 @@
1.124 offer(item);
1.125 }
1.126 }
1.127 -
1.128 - // Unsafe mechanics
1.129 -
1.130 - private static final sun.misc.Unsafe UNSAFE;
1.131 - private static final long headOffset;
1.132 - private static final long tailOffset;
1.133 - private static final long sweepVotesOffset;
1.134 - static {
1.135 - try {
1.136 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.137 - Class k = LinkedTransferQueue.class;
1.138 - headOffset = UNSAFE.objectFieldOffset
1.139 - (k.getDeclaredField("head"));
1.140 - tailOffset = UNSAFE.objectFieldOffset
1.141 - (k.getDeclaredField("tail"));
1.142 - sweepVotesOffset = UNSAFE.objectFieldOffset
1.143 - (k.getDeclaredField("sweepVotes"));
1.144 - } catch (Exception e) {
1.145 - throw new Error(e);
1.146 - }
1.147 - }
1.148 }