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