rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java
changeset 1895 bfaf3300b7ba
parent 1890 212417b74b72
     1.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java	Sat Mar 19 10:46:31 2016 +0100
     1.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java	Sat Mar 19 12:51:03 2016 +0100
     1.3 @@ -302,49 +302,39 @@
     1.4           * only be seen after publication via casNext or casPrev.
     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 +            if (next == cmp) {
    1.28 +                next = val;
    1.29 +                return true;
    1.30 +            }
    1.31 +            return false;
    1.32          }
    1.33  
    1.34          void lazySetPrev(Node<E> val) {
    1.35 -            UNSAFE.putOrderedObject(this, prevOffset, val);
    1.36 +            this.prev = val;
    1.37          }
    1.38  
    1.39          boolean casPrev(Node<E> cmp, Node<E> val) {
    1.40 -            return UNSAFE.compareAndSwapObject(this, prevOffset, cmp, val);
    1.41 -        }
    1.42 -
    1.43 -        // Unsafe mechanics
    1.44 -
    1.45 -        private static final sun.misc.Unsafe UNSAFE;
    1.46 -        private static final long prevOffset;
    1.47 -        private static final long itemOffset;
    1.48 -        private static final long nextOffset;
    1.49 -
    1.50 -        static {
    1.51 -            try {
    1.52 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
    1.53 -                Class k = Node.class;
    1.54 -                prevOffset = UNSAFE.objectFieldOffset
    1.55 -                    (k.getDeclaredField("prev"));
    1.56 -                itemOffset = UNSAFE.objectFieldOffset
    1.57 -                    (k.getDeclaredField("item"));
    1.58 -                nextOffset = UNSAFE.objectFieldOffset
    1.59 -                    (k.getDeclaredField("next"));
    1.60 -            } catch (Exception e) {
    1.61 -                throw new Error(e);
    1.62 +            if (prev == cmp) {
    1.63 +                prev = val;
    1.64 +                return true;
    1.65              }
    1.66 +            return false;
    1.67          }
    1.68      }
    1.69  
    1.70 @@ -1438,32 +1428,25 @@
    1.71  
    1.72  
    1.73      private boolean casHead(Node<E> cmp, Node<E> val) {
    1.74 -        return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
    1.75 +        if (head == cmp) {
    1.76 +            head = val;
    1.77 +            return true;
    1.78 +        }
    1.79 +        return false;
    1.80      }
    1.81  
    1.82      private boolean casTail(Node<E> cmp, Node<E> val) {
    1.83 -        return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
    1.84 +        if (tail == cmp) {
    1.85 +            tail = val;
    1.86 +            return true;
    1.87 +        }
    1.88 +        return false;
    1.89      }
    1.90  
    1.91 -    // Unsafe mechanics
    1.92 -
    1.93 -    private static final sun.misc.Unsafe UNSAFE;
    1.94 -    private static final long headOffset;
    1.95 -    private static final long tailOffset;
    1.96      static {
    1.97          PREV_TERMINATOR = new Node<Object>();
    1.98          PREV_TERMINATOR.next = PREV_TERMINATOR;
    1.99          NEXT_TERMINATOR = new Node<Object>();
   1.100          NEXT_TERMINATOR.prev = NEXT_TERMINATOR;
   1.101 -        try {
   1.102 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
   1.103 -            Class k = ConcurrentLinkedDeque.class;
   1.104 -            headOffset = UNSAFE.objectFieldOffset
   1.105 -                (k.getDeclaredField("head"));
   1.106 -            tailOffset = UNSAFE.objectFieldOffset
   1.107 -                (k.getDeclaredField("tail"));
   1.108 -        } catch (Exception e) {
   1.109 -            throw new Error(e);
   1.110 -        }
   1.111      }
   1.112  }