rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java
changeset 1895 bfaf3300b7ba
parent 1890 212417b74b72
     1.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java	Sat Mar 19 10:46:31 2016 +0100
     1.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java	Sat Mar 19 12:51:03 2016 +0100
     1.3 @@ -35,7 +35,6 @@
     1.4  
     1.5  package java.util.concurrent;
     1.6  import java.util.*;
     1.7 -import java.util.concurrent.atomic.*;
     1.8  
     1.9  /**
    1.10   * A scalable concurrent {@link ConcurrentNavigableMap} implementation.
    1.11 @@ -379,7 +378,11 @@
    1.12       * compareAndSet head node
    1.13       */
    1.14      private boolean casHead(HeadIndex<K,V> cmp, HeadIndex<K,V> val) {
    1.15 -        return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
    1.16 +        if (head == cmp) {
    1.17 +            head = val;
    1.18 +            return true;
    1.19 +        }
    1.20 +        return false;
    1.21      }
    1.22  
    1.23      /* ---------------- Nodes -------------- */
    1.24 @@ -422,14 +425,22 @@
    1.25           * compareAndSet value field
    1.26           */
    1.27          boolean casValue(Object cmp, Object val) {
    1.28 -            return UNSAFE.compareAndSwapObject(this, valueOffset, cmp, val);
    1.29 +            if (value == cmp) {
    1.30 +                value = val;
    1.31 +                return true;
    1.32 +            }
    1.33 +            return false;
    1.34          }
    1.35  
    1.36          /**
    1.37           * compareAndSet next field
    1.38           */
    1.39          boolean casNext(Node<K,V> cmp, Node<K,V> val) {
    1.40 -            return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
    1.41 +            if (next == cmp) {
    1.42 +                next = val;
    1.43 +                return true;
    1.44 +            }
    1.45 +            return false;
    1.46          }
    1.47  
    1.48          /**
    1.49 @@ -507,25 +518,6 @@
    1.50                  return null;
    1.51              return new AbstractMap.SimpleImmutableEntry<K,V>(key, v);
    1.52          }
    1.53 -
    1.54 -        // UNSAFE mechanics
    1.55 -
    1.56 -        private static final sun.misc.Unsafe UNSAFE;
    1.57 -        private static final long valueOffset;
    1.58 -        private static final long nextOffset;
    1.59 -
    1.60 -        static {
    1.61 -            try {
    1.62 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
    1.63 -                Class k = Node.class;
    1.64 -                valueOffset = UNSAFE.objectFieldOffset
    1.65 -                    (k.getDeclaredField("value"));
    1.66 -                nextOffset = UNSAFE.objectFieldOffset
    1.67 -                    (k.getDeclaredField("next"));
    1.68 -            } catch (Exception e) {
    1.69 -                throw new Error(e);
    1.70 -            }
    1.71 -        }
    1.72      }
    1.73  
    1.74      /* ---------------- Indexing -------------- */
    1.75 @@ -555,7 +547,11 @@
    1.76           * compareAndSet right field
    1.77           */
    1.78          final boolean casRight(Index<K,V> cmp, Index<K,V> val) {
    1.79 -            return UNSAFE.compareAndSwapObject(this, rightOffset, cmp, val);
    1.80 +            if (right == cmp) {
    1.81 +                right = val;
    1.82 +                return true;
    1.83 +            }
    1.84 +            return false;
    1.85          }
    1.86  
    1.87          /**
    1.88 @@ -590,20 +586,6 @@
    1.89          final boolean unlink(Index<K,V> succ) {
    1.90              return !indexesDeletedNode() && casRight(succ, succ.right);
    1.91          }
    1.92 -
    1.93 -        // Unsafe mechanics
    1.94 -        private static final sun.misc.Unsafe UNSAFE;
    1.95 -        private static final long rightOffset;
    1.96 -        static {
    1.97 -            try {
    1.98 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
    1.99 -                Class k = Index.class;
   1.100 -                rightOffset = UNSAFE.objectFieldOffset
   1.101 -                    (k.getDeclaredField("right"));
   1.102 -            } catch (Exception e) {
   1.103 -                throw new Error(e);
   1.104 -            }
   1.105 -        }
   1.106      }
   1.107  
   1.108      /* ---------------- Head nodes -------------- */
   1.109 @@ -3102,18 +3084,4 @@
   1.110              }
   1.111          }
   1.112      }
   1.113 -
   1.114 -    // Unsafe mechanics
   1.115 -    private static final sun.misc.Unsafe UNSAFE;
   1.116 -    private static final long headOffset;
   1.117 -    static {
   1.118 -        try {
   1.119 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
   1.120 -            Class k = ConcurrentSkipListMap.class;
   1.121 -            headOffset = UNSAFE.objectFieldOffset
   1.122 -                (k.getDeclaredField("head"));
   1.123 -        } catch (Exception e) {
   1.124 -            throw new Error(e);
   1.125 -        }
   1.126 -    }
   1.127  }