1.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/SynchronousQueue.java Sat Mar 19 10:46:31 2016 +0100
1.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/SynchronousQueue.java Sat Mar 19 12:51:03 2016 +0100
1.3 @@ -36,7 +36,6 @@
1.4
1.5 package java.util.concurrent;
1.6 import java.util.concurrent.locks.*;
1.7 -import java.util.concurrent.atomic.*;
1.8 import java.util.*;
1.9
1.10 /**
1.11 @@ -181,7 +180,7 @@
1.12 }
1.13
1.14 /** The number of CPUs, for spin control */
1.15 - static final int NCPUS = Runtime.getRuntime().availableProcessors();
1.16 + static final int NCPUS = 1;
1.17
1.18 /**
1.19 * The number of times to spin before blocking in timed waits.
1.20 @@ -242,8 +241,11 @@
1.21 }
1.22
1.23 boolean casNext(SNode cmp, SNode val) {
1.24 - return cmp == next &&
1.25 - UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
1.26 + if (next == cmp) {
1.27 + next = val;
1.28 + return true;
1.29 + }
1.30 + return false;
1.31 }
1.32
1.33 /**
1.34 @@ -255,8 +257,8 @@
1.35 * @return true if successfully matched to s
1.36 */
1.37 boolean tryMatch(SNode s) {
1.38 - if (match == null &&
1.39 - UNSAFE.compareAndSwapObject(this, matchOffset, null, s)) {
1.40 + if (match == null) {
1.41 + match = s;
1.42 Thread w = waiter;
1.43 if (w != null) { // waiters need at most one unpark
1.44 waiter = null;
1.45 @@ -271,38 +273,25 @@
1.46 * Tries to cancel a wait by matching node to itself.
1.47 */
1.48 void tryCancel() {
1.49 - UNSAFE.compareAndSwapObject(this, matchOffset, null, this);
1.50 + if (match == null) {
1.51 + match = this;
1.52 + }
1.53 }
1.54
1.55 boolean isCancelled() {
1.56 return match == this;
1.57 }
1.58 -
1.59 - // Unsafe mechanics
1.60 - private static final sun.misc.Unsafe UNSAFE;
1.61 - private static final long matchOffset;
1.62 - private static final long nextOffset;
1.63 -
1.64 - static {
1.65 - try {
1.66 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.67 - Class k = SNode.class;
1.68 - matchOffset = UNSAFE.objectFieldOffset
1.69 - (k.getDeclaredField("match"));
1.70 - nextOffset = UNSAFE.objectFieldOffset
1.71 - (k.getDeclaredField("next"));
1.72 - } catch (Exception e) {
1.73 - throw new Error(e);
1.74 - }
1.75 - }
1.76 }
1.77
1.78 /** The head (top) of the stack */
1.79 volatile SNode head;
1.80
1.81 boolean casHead(SNode h, SNode nh) {
1.82 - return h == head &&
1.83 - UNSAFE.compareAndSwapObject(this, headOffset, h, nh);
1.84 + if (head == h) {
1.85 + head = nh;
1.86 + return true;
1.87 + }
1.88 + return false;
1.89 }
1.90
1.91 /**
1.92 @@ -506,20 +495,6 @@
1.93 p = n;
1.94 }
1.95 }
1.96 -
1.97 - // Unsafe mechanics
1.98 - private static final sun.misc.Unsafe UNSAFE;
1.99 - private static final long headOffset;
1.100 - static {
1.101 - try {
1.102 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.103 - Class k = TransferStack.class;
1.104 - headOffset = UNSAFE.objectFieldOffset
1.105 - (k.getDeclaredField("head"));
1.106 - } catch (Exception e) {
1.107 - throw new Error(e);
1.108 - }
1.109 - }
1.110 }
1.111
1.112 /** Dual Queue */
1.113 @@ -546,20 +521,28 @@
1.114 }
1.115
1.116 boolean casNext(QNode cmp, QNode val) {
1.117 - return next == cmp &&
1.118 - UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
1.119 + if (next == cmp) {
1.120 + next = val;
1.121 + return true;
1.122 + }
1.123 + return false;
1.124 }
1.125
1.126 boolean casItem(Object cmp, Object val) {
1.127 - return item == cmp &&
1.128 - UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
1.129 + if (item == cmp) {
1.130 + item = val;
1.131 + return true;
1.132 + }
1.133 + return false;
1.134 }
1.135
1.136 /**
1.137 * Tries to cancel by CAS'ing ref to this as item.
1.138 */
1.139 void tryCancel(Object cmp) {
1.140 - UNSAFE.compareAndSwapObject(this, itemOffset, cmp, this);
1.141 + if (item == cmp) {
1.142 + item = this;
1.143 + }
1.144 }
1.145
1.146 boolean isCancelled() {
1.147 @@ -574,24 +557,6 @@
1.148 boolean isOffList() {
1.149 return next == this;
1.150 }
1.151 -
1.152 - // Unsafe mechanics
1.153 - private static final sun.misc.Unsafe UNSAFE;
1.154 - private static final long itemOffset;
1.155 - private static final long nextOffset;
1.156 -
1.157 - static {
1.158 - try {
1.159 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.160 - Class k = QNode.class;
1.161 - itemOffset = UNSAFE.objectFieldOffset
1.162 - (k.getDeclaredField("item"));
1.163 - nextOffset = UNSAFE.objectFieldOffset
1.164 - (k.getDeclaredField("next"));
1.165 - } catch (Exception e) {
1.166 - throw new Error(e);
1.167 - }
1.168 - }
1.169 }
1.170
1.171 /** Head of queue */
1.172 @@ -616,25 +581,30 @@
1.173 * old head's next node to avoid garbage retention.
1.174 */
1.175 void advanceHead(QNode h, QNode nh) {
1.176 - if (h == head &&
1.177 - UNSAFE.compareAndSwapObject(this, headOffset, h, nh))
1.178 + if (head == h) {
1.179 + head = nh;
1.180 h.next = h; // forget old next
1.181 + }
1.182 }
1.183
1.184 /**
1.185 * Tries to cas nt as new tail.
1.186 */
1.187 void advanceTail(QNode t, QNode nt) {
1.188 - if (tail == t)
1.189 - UNSAFE.compareAndSwapObject(this, tailOffset, t, nt);
1.190 + if (tail == t) {
1.191 + tail = nt;
1.192 + }
1.193 }
1.194
1.195 /**
1.196 * Tries to CAS cleanMe slot.
1.197 */
1.198 boolean casCleanMe(QNode cmp, QNode val) {
1.199 - return cleanMe == cmp &&
1.200 - UNSAFE.compareAndSwapObject(this, cleanMeOffset, cmp, val);
1.201 + if (cleanMe == cmp) {
1.202 + cleanMe = val;
1.203 + return true;
1.204 + }
1.205 + return false;
1.206 }
1.207
1.208 /**
1.209 @@ -819,25 +789,6 @@
1.210 return; // Postpone cleaning s
1.211 }
1.212 }
1.213 -
1.214 - private static final sun.misc.Unsafe UNSAFE;
1.215 - private static final long headOffset;
1.216 - private static final long tailOffset;
1.217 - private static final long cleanMeOffset;
1.218 - static {
1.219 - try {
1.220 - UNSAFE = sun.misc.Unsafe.getUnsafe();
1.221 - Class k = TransferQueue.class;
1.222 - headOffset = UNSAFE.objectFieldOffset
1.223 - (k.getDeclaredField("head"));
1.224 - tailOffset = UNSAFE.objectFieldOffset
1.225 - (k.getDeclaredField("tail"));
1.226 - cleanMeOffset = UNSAFE.objectFieldOffset
1.227 - (k.getDeclaredField("cleanMe"));
1.228 - } catch (Exception e) {
1.229 - throw new Error(e);
1.230 - }
1.231 - }
1.232 }
1.233
1.234 /**
1.235 @@ -1180,17 +1131,5 @@
1.236 transferer = new TransferStack();
1.237 }
1.238
1.239 - // Unsafe mechanics
1.240 - static long objectFieldOffset(sun.misc.Unsafe UNSAFE,
1.241 - String field, Class<?> klazz) {
1.242 - try {
1.243 - return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
1.244 - } catch (NoSuchFieldException e) {
1.245 - // Convert Exception to corresponding Error
1.246 - NoSuchFieldError error = new NoSuchFieldError(field);
1.247 - error.initCause(e);
1.248 - throw error;
1.249 - }
1.250 - }
1.251
1.252 }