rt/emul/compact/src/main/java/java/util/concurrent/SynchronousQueue.java
changeset 1895 bfaf3300b7ba
parent 1890 212417b74b72
     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  }