Making java.util.concurrent package compilable except ForkJoinPool
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 19 Mar 2016 12:51:03 +0100
changeset 1895bfaf3300b7ba
parent 1894 75ee4eca04e3
child 1896 9984d9a62bc0
Making java.util.concurrent package compilable except ForkJoinPool
rt/aot-nb-test/pom.xml
rt/aot-nb-test/src/main/java/org/apidesign/bck2brwsr/aot/junit/RunTest.java
rt/aot-nb-test/src/main/java/org/apidesign/bck2brwsr/aot/junit/TestedTest.java
rt/aot-nb-test/src/test/java/org/apidesign/bck2brwsr/aot/junit/test/JUnitRunTest.java
rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java
rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedQueue.java
rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java
rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListSet.java
rt/emul/compact/src/main/java/java/util/concurrent/CopyOnWriteArrayList.java
rt/emul/compact/src/main/java/java/util/concurrent/Exchanger.java
rt/emul/compact/src/main/java/java/util/concurrent/Executors.java
rt/emul/compact/src/main/java/java/util/concurrent/ForkJoinPool.java
rt/emul/compact/src/main/java/java/util/concurrent/LinkedTransferQueue.java
rt/emul/compact/src/main/java/java/util/concurrent/Phaser.java
rt/emul/compact/src/main/java/java/util/concurrent/PriorityBlockingQueue.java
rt/emul/compact/src/main/java/java/util/concurrent/SynchronousQueue.java
rt/emul/compact/src/main/java/java/util/concurrent/ThreadPoolExecutor.java
rt/emul/compact/src/main/java/java/util/concurrent/TimeUnit.java
     1.1 --- a/rt/aot-nb-test/pom.xml	Sat Mar 19 11:01:40 2016 +0100
     1.2 +++ b/rt/aot-nb-test/pom.xml	Sat Mar 19 12:51:03 2016 +0100
     1.3 @@ -53,6 +53,12 @@
     1.4              <version>${project.version}</version>
     1.5              <scope>test</scope>
     1.6          </dependency>
     1.7 +        <dependency>
     1.8 +            <groupId>junit</groupId>
     1.9 +            <artifactId>junit</artifactId>
    1.10 +            <version>4.12</version>
    1.11 +            <type>jar</type>
    1.12 +        </dependency>
    1.13      </dependencies>
    1.14      <build>
    1.15          <plugins>
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/rt/aot-nb-test/src/main/java/org/apidesign/bck2brwsr/aot/junit/RunTest.java	Sat Mar 19 12:51:03 2016 +0100
     2.3 @@ -0,0 +1,67 @@
     2.4 +/**
     2.5 + * Back 2 Browser Bytecode Translator
     2.6 + * Copyright (C) 2012-2015 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     2.7 + *
     2.8 + * This program is free software: you can redistribute it and/or modify
     2.9 + * it under the terms of the GNU General Public License as published by
    2.10 + * the Free Software Foundation, version 2 of the License.
    2.11 + *
    2.12 + * This program is distributed in the hope that it will be useful,
    2.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    2.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    2.15 + * GNU General Public License for more details.
    2.16 + *
    2.17 + * You should have received a copy of the GNU General Public License
    2.18 + * along with this program. Look for COPYING file in the top folder.
    2.19 + * If not, see http://opensource.org/licenses/GPL-2.0.
    2.20 + */
    2.21 +package org.apidesign.bck2brwsr.aot.junit;
    2.22 +
    2.23 +import java.io.PrintStream;
    2.24 +import java.io.UnsupportedEncodingException;
    2.25 +import junit.framework.AssertionFailedError;
    2.26 +import junit.framework.JUnit4TestAdapter;
    2.27 +import junit.framework.Test;
    2.28 +import junit.framework.TestListener;
    2.29 +import junit.framework.TestResult;
    2.30 +import junit.textui.ResultPrinter;
    2.31 +
    2.32 +public class RunTest extends ResultPrinter {
    2.33 +    public static void main(String... args) throws UnsupportedEncodingException {
    2.34 +        System.err.println(run());
    2.35 +    }
    2.36 +
    2.37 +    public static String run() throws UnsupportedEncodingException {
    2.38 +        TestResult tr = new TestResult();
    2.39 +        class L implements TestListener {
    2.40 +            StringBuilder sb = new StringBuilder();
    2.41 +
    2.42 +            @Override
    2.43 +            public void addError(Test test, Throwable e) {
    2.44 +                sb.append(test.toString()).append("\n");
    2.45 +            }
    2.46 +
    2.47 +            @Override
    2.48 +            public void addFailure(Test test, AssertionFailedError e) {
    2.49 +                sb.append(test.toString()).append("\n");;
    2.50 +            }
    2.51 +
    2.52 +            @Override
    2.53 +            public void endTest(Test test) {
    2.54 +            }
    2.55 +
    2.56 +            @Override
    2.57 +            public void startTest(Test test) {
    2.58 +            }
    2.59 +        }
    2.60 +        L listener = new L();
    2.61 +        tr.addListener(listener);
    2.62 +        JUnit4TestAdapter suite = new JUnit4TestAdapter(TestedTest.class);
    2.63 +        suite.run(tr);
    2.64 +        return listener.sb.toString();
    2.65 +    }
    2.66 +
    2.67 +    RunTest(PrintStream writer) {
    2.68 +        super(writer);
    2.69 +    }
    2.70 +}
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/rt/aot-nb-test/src/main/java/org/apidesign/bck2brwsr/aot/junit/TestedTest.java	Sat Mar 19 12:51:03 2016 +0100
     3.3 @@ -0,0 +1,32 @@
     3.4 +/**
     3.5 + * Back 2 Browser Bytecode Translator
     3.6 + * Copyright (C) 2012-2015 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     3.7 + *
     3.8 + * This program is free software: you can redistribute it and/or modify
     3.9 + * it under the terms of the GNU General Public License as published by
    3.10 + * the Free Software Foundation, version 2 of the License.
    3.11 + *
    3.12 + * This program is distributed in the hope that it will be useful,
    3.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    3.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    3.15 + * GNU General Public License for more details.
    3.16 + *
    3.17 + * You should have received a copy of the GNU General Public License
    3.18 + * along with this program. Look for COPYING file in the top folder.
    3.19 + * If not, see http://opensource.org/licenses/GPL-2.0.
    3.20 + */
    3.21 +package org.apidesign.bck2brwsr.aot.junit;
    3.22 +
    3.23 +import org.junit.Test;
    3.24 +import static org.junit.Assert.fail;
    3.25 +
    3.26 +public class TestedTest {
    3.27 +    @Test
    3.28 +    public void ok() {
    3.29 +    }
    3.30 +
    3.31 +    @Test
    3.32 +    public void error() {
    3.33 +        fail("Failing");
    3.34 +    }
    3.35 +}
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/rt/aot-nb-test/src/test/java/org/apidesign/bck2brwsr/aot/junit/test/JUnitRunTest.java	Sat Mar 19 12:51:03 2016 +0100
     4.3 @@ -0,0 +1,37 @@
     4.4 +/**
     4.5 + * Back 2 Browser Bytecode Translator
     4.6 + * Copyright (C) 2012-2015 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4.7 + *
     4.8 + * This program is free software: you can redistribute it and/or modify
     4.9 + * it under the terms of the GNU General Public License as published by
    4.10 + * the Free Software Foundation, version 2 of the License.
    4.11 + *
    4.12 + * This program is distributed in the hope that it will be useful,
    4.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    4.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    4.15 + * GNU General Public License for more details.
    4.16 + *
    4.17 + * You should have received a copy of the GNU General Public License
    4.18 + * along with this program. Look for COPYING file in the top folder.
    4.19 + * If not, see http://opensource.org/licenses/GPL-2.0.
    4.20 + */
    4.21 +package org.apidesign.bck2brwsr.aot.junit.test;
    4.22 +
    4.23 +import org.apidesign.bck2brwsr.aot.junit.RunTest;
    4.24 +import org.apidesign.bck2brwsr.vmtest.Compare;
    4.25 +import org.apidesign.bck2brwsr.vmtest.VMTest;
    4.26 +import org.testng.annotations.Factory;
    4.27 +
    4.28 +/**
    4.29 + *
    4.30 + * @author Jaroslav Tulach
    4.31 + */
    4.32 +public class JUnitRunTest {
    4.33 +    @Compare public String runTests() throws Exception {
    4.34 +        return RunTest.run();
    4.35 +    }
    4.36 +
    4.37 +    @Factory public static Object[] create() {
    4.38 +        return VMTest.create(JUnitRunTest.class);
    4.39 +    }
    4.40 +}
     5.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java	Sat Mar 19 11:01:40 2016 +0100
     5.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java	Sat Mar 19 12:51:03 2016 +0100
     5.3 @@ -302,49 +302,39 @@
     5.4           * only be seen after publication via casNext or casPrev.
     5.5           */
     5.6          Node(E item) {
     5.7 -            UNSAFE.putObject(this, itemOffset, item);
     5.8 +            this.item = item;
     5.9          }
    5.10  
    5.11          boolean casItem(E cmp, E val) {
    5.12 -            return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
    5.13 +            if (item == cmp) {
    5.14 +                item = val;
    5.15 +                return true;
    5.16 +            }
    5.17 +            return false;
    5.18          }
    5.19  
    5.20          void lazySetNext(Node<E> val) {
    5.21 -            UNSAFE.putOrderedObject(this, nextOffset, val);
    5.22 +            this.next = val;
    5.23          }
    5.24  
    5.25          boolean casNext(Node<E> cmp, Node<E> val) {
    5.26 -            return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
    5.27 +            if (next == cmp) {
    5.28 +                next = val;
    5.29 +                return true;
    5.30 +            }
    5.31 +            return false;
    5.32          }
    5.33  
    5.34          void lazySetPrev(Node<E> val) {
    5.35 -            UNSAFE.putOrderedObject(this, prevOffset, val);
    5.36 +            this.prev = val;
    5.37          }
    5.38  
    5.39          boolean casPrev(Node<E> cmp, Node<E> val) {
    5.40 -            return UNSAFE.compareAndSwapObject(this, prevOffset, cmp, val);
    5.41 -        }
    5.42 -
    5.43 -        // Unsafe mechanics
    5.44 -
    5.45 -        private static final sun.misc.Unsafe UNSAFE;
    5.46 -        private static final long prevOffset;
    5.47 -        private static final long itemOffset;
    5.48 -        private static final long nextOffset;
    5.49 -
    5.50 -        static {
    5.51 -            try {
    5.52 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
    5.53 -                Class k = Node.class;
    5.54 -                prevOffset = UNSAFE.objectFieldOffset
    5.55 -                    (k.getDeclaredField("prev"));
    5.56 -                itemOffset = UNSAFE.objectFieldOffset
    5.57 -                    (k.getDeclaredField("item"));
    5.58 -                nextOffset = UNSAFE.objectFieldOffset
    5.59 -                    (k.getDeclaredField("next"));
    5.60 -            } catch (Exception e) {
    5.61 -                throw new Error(e);
    5.62 +            if (prev == cmp) {
    5.63 +                prev = val;
    5.64 +                return true;
    5.65              }
    5.66 +            return false;
    5.67          }
    5.68      }
    5.69  
    5.70 @@ -1438,32 +1428,25 @@
    5.71  
    5.72  
    5.73      private boolean casHead(Node<E> cmp, Node<E> val) {
    5.74 -        return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
    5.75 +        if (head == cmp) {
    5.76 +            head = val;
    5.77 +            return true;
    5.78 +        }
    5.79 +        return false;
    5.80      }
    5.81  
    5.82      private boolean casTail(Node<E> cmp, Node<E> val) {
    5.83 -        return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
    5.84 +        if (tail == cmp) {
    5.85 +            tail = val;
    5.86 +            return true;
    5.87 +        }
    5.88 +        return false;
    5.89      }
    5.90  
    5.91 -    // Unsafe mechanics
    5.92 -
    5.93 -    private static final sun.misc.Unsafe UNSAFE;
    5.94 -    private static final long headOffset;
    5.95 -    private static final long tailOffset;
    5.96      static {
    5.97          PREV_TERMINATOR = new Node<Object>();
    5.98          PREV_TERMINATOR.next = PREV_TERMINATOR;
    5.99          NEXT_TERMINATOR = new Node<Object>();
   5.100          NEXT_TERMINATOR.prev = NEXT_TERMINATOR;
   5.101 -        try {
   5.102 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
   5.103 -            Class k = ConcurrentLinkedDeque.class;
   5.104 -            headOffset = UNSAFE.objectFieldOffset
   5.105 -                (k.getDeclaredField("head"));
   5.106 -            tailOffset = UNSAFE.objectFieldOffset
   5.107 -                (k.getDeclaredField("tail"));
   5.108 -        } catch (Exception e) {
   5.109 -            throw new Error(e);
   5.110 -        }
   5.111      }
   5.112  }
     6.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedQueue.java	Sat Mar 19 11:01:40 2016 +0100
     6.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedQueue.java	Sat Mar 19 12:51:03 2016 +0100
     6.3 @@ -184,38 +184,27 @@
     6.4           * only be seen after publication via casNext.
     6.5           */
     6.6          Node(E item) {
     6.7 -            UNSAFE.putObject(this, itemOffset, item);
     6.8 +            this.item = item;
     6.9          }
    6.10  
    6.11          boolean casItem(E cmp, E val) {
    6.12 -            return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
    6.13 +            if (item == cmp) {
    6.14 +                item = val;
    6.15 +                return true;
    6.16 +            }
    6.17 +            return false;
    6.18          }
    6.19  
    6.20          void lazySetNext(Node<E> val) {
    6.21 -            UNSAFE.putOrderedObject(this, nextOffset, val);
    6.22 +            this.next = val;
    6.23          }
    6.24  
    6.25          boolean casNext(Node<E> cmp, Node<E> val) {
    6.26 -            return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
    6.27 -        }
    6.28 -
    6.29 -        // Unsafe mechanics
    6.30 -
    6.31 -        private static final sun.misc.Unsafe UNSAFE;
    6.32 -        private static final long itemOffset;
    6.33 -        private static final long nextOffset;
    6.34 -
    6.35 -        static {
    6.36 -            try {
    6.37 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
    6.38 -                Class k = Node.class;
    6.39 -                itemOffset = UNSAFE.objectFieldOffset
    6.40 -                    (k.getDeclaredField("item"));
    6.41 -                nextOffset = UNSAFE.objectFieldOffset
    6.42 -                    (k.getDeclaredField("next"));
    6.43 -            } catch (Exception e) {
    6.44 -                throw new Error(e);
    6.45 +            if (next == cmp) {
    6.46 +                next = val;
    6.47 +                return true;
    6.48              }
    6.49 +            return false;
    6.50          }
    6.51      }
    6.52  
    6.53 @@ -808,28 +797,19 @@
    6.54      }
    6.55  
    6.56      private boolean casTail(Node<E> cmp, Node<E> val) {
    6.57 -        return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
    6.58 +        if (tail == cmp) {
    6.59 +            tail = val;
    6.60 +            return true;
    6.61 +        }
    6.62 +        return false;
    6.63      }
    6.64  
    6.65      private boolean casHead(Node<E> cmp, Node<E> val) {
    6.66 -        return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
    6.67 +        if (head == cmp) {
    6.68 +            head = val;
    6.69 +            return true;
    6.70 +        }
    6.71 +        return false;
    6.72      }
    6.73  
    6.74 -    // Unsafe mechanics
    6.75 -
    6.76 -    private static final sun.misc.Unsafe UNSAFE;
    6.77 -    private static final long headOffset;
    6.78 -    private static final long tailOffset;
    6.79 -    static {
    6.80 -        try {
    6.81 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
    6.82 -            Class k = ConcurrentLinkedQueue.class;
    6.83 -            headOffset = UNSAFE.objectFieldOffset
    6.84 -                (k.getDeclaredField("head"));
    6.85 -            tailOffset = UNSAFE.objectFieldOffset
    6.86 -                (k.getDeclaredField("tail"));
    6.87 -        } catch (Exception e) {
    6.88 -            throw new Error(e);
    6.89 -        }
    6.90 -    }
    6.91  }
     7.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java	Sat Mar 19 11:01:40 2016 +0100
     7.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java	Sat Mar 19 12:51:03 2016 +0100
     7.3 @@ -35,7 +35,6 @@
     7.4  
     7.5  package java.util.concurrent;
     7.6  import java.util.*;
     7.7 -import java.util.concurrent.atomic.*;
     7.8  
     7.9  /**
    7.10   * A scalable concurrent {@link ConcurrentNavigableMap} implementation.
    7.11 @@ -379,7 +378,11 @@
    7.12       * compareAndSet head node
    7.13       */
    7.14      private boolean casHead(HeadIndex<K,V> cmp, HeadIndex<K,V> val) {
    7.15 -        return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
    7.16 +        if (head == cmp) {
    7.17 +            head = val;
    7.18 +            return true;
    7.19 +        }
    7.20 +        return false;
    7.21      }
    7.22  
    7.23      /* ---------------- Nodes -------------- */
    7.24 @@ -422,14 +425,22 @@
    7.25           * compareAndSet value field
    7.26           */
    7.27          boolean casValue(Object cmp, Object val) {
    7.28 -            return UNSAFE.compareAndSwapObject(this, valueOffset, cmp, val);
    7.29 +            if (value == cmp) {
    7.30 +                value = val;
    7.31 +                return true;
    7.32 +            }
    7.33 +            return false;
    7.34          }
    7.35  
    7.36          /**
    7.37           * compareAndSet next field
    7.38           */
    7.39          boolean casNext(Node<K,V> cmp, Node<K,V> val) {
    7.40 -            return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
    7.41 +            if (next == cmp) {
    7.42 +                next = val;
    7.43 +                return true;
    7.44 +            }
    7.45 +            return false;
    7.46          }
    7.47  
    7.48          /**
    7.49 @@ -507,25 +518,6 @@
    7.50                  return null;
    7.51              return new AbstractMap.SimpleImmutableEntry<K,V>(key, v);
    7.52          }
    7.53 -
    7.54 -        // UNSAFE mechanics
    7.55 -
    7.56 -        private static final sun.misc.Unsafe UNSAFE;
    7.57 -        private static final long valueOffset;
    7.58 -        private static final long nextOffset;
    7.59 -
    7.60 -        static {
    7.61 -            try {
    7.62 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
    7.63 -                Class k = Node.class;
    7.64 -                valueOffset = UNSAFE.objectFieldOffset
    7.65 -                    (k.getDeclaredField("value"));
    7.66 -                nextOffset = UNSAFE.objectFieldOffset
    7.67 -                    (k.getDeclaredField("next"));
    7.68 -            } catch (Exception e) {
    7.69 -                throw new Error(e);
    7.70 -            }
    7.71 -        }
    7.72      }
    7.73  
    7.74      /* ---------------- Indexing -------------- */
    7.75 @@ -555,7 +547,11 @@
    7.76           * compareAndSet right field
    7.77           */
    7.78          final boolean casRight(Index<K,V> cmp, Index<K,V> val) {
    7.79 -            return UNSAFE.compareAndSwapObject(this, rightOffset, cmp, val);
    7.80 +            if (right == cmp) {
    7.81 +                right = val;
    7.82 +                return true;
    7.83 +            }
    7.84 +            return false;
    7.85          }
    7.86  
    7.87          /**
    7.88 @@ -590,20 +586,6 @@
    7.89          final boolean unlink(Index<K,V> succ) {
    7.90              return !indexesDeletedNode() && casRight(succ, succ.right);
    7.91          }
    7.92 -
    7.93 -        // Unsafe mechanics
    7.94 -        private static final sun.misc.Unsafe UNSAFE;
    7.95 -        private static final long rightOffset;
    7.96 -        static {
    7.97 -            try {
    7.98 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
    7.99 -                Class k = Index.class;
   7.100 -                rightOffset = UNSAFE.objectFieldOffset
   7.101 -                    (k.getDeclaredField("right"));
   7.102 -            } catch (Exception e) {
   7.103 -                throw new Error(e);
   7.104 -            }
   7.105 -        }
   7.106      }
   7.107  
   7.108      /* ---------------- Head nodes -------------- */
   7.109 @@ -3102,18 +3084,4 @@
   7.110              }
   7.111          }
   7.112      }
   7.113 -
   7.114 -    // Unsafe mechanics
   7.115 -    private static final sun.misc.Unsafe UNSAFE;
   7.116 -    private static final long headOffset;
   7.117 -    static {
   7.118 -        try {
   7.119 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
   7.120 -            Class k = ConcurrentSkipListMap.class;
   7.121 -            headOffset = UNSAFE.objectFieldOffset
   7.122 -                (k.getDeclaredField("head"));
   7.123 -        } catch (Exception e) {
   7.124 -            throw new Error(e);
   7.125 -        }
   7.126 -    }
   7.127  }
     8.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListSet.java	Sat Mar 19 11:01:40 2016 +0100
     8.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListSet.java	Sat Mar 19 12:51:03 2016 +0100
     8.3 @@ -35,7 +35,6 @@
     8.4  
     8.5  package java.util.concurrent;
     8.6  import java.util.*;
     8.7 -import sun.misc.Unsafe;
     8.8  
     8.9  /**
    8.10   * A scalable concurrent {@link NavigableSet} implementation based on
    8.11 @@ -93,7 +92,7 @@
    8.12       * element.  This field is declared final for the sake of thread
    8.13       * safety, which entails some ugliness in clone()
    8.14       */
    8.15 -    private final ConcurrentNavigableMap<E,Object> m;
    8.16 +    private ConcurrentNavigableMap<E,Object> m;
    8.17  
    8.18      /**
    8.19       * Constructs a new, empty set that orders its elements according to
    8.20 @@ -473,19 +472,6 @@
    8.21  
    8.22      // Support for resetting map in clone
    8.23      private void setMap(ConcurrentNavigableMap<E,Object> map) {
    8.24 -        UNSAFE.putObjectVolatile(this, mapOffset, map);
    8.25 -    }
    8.26 -
    8.27 -    private static final sun.misc.Unsafe UNSAFE;
    8.28 -    private static final long mapOffset;
    8.29 -    static {
    8.30 -        try {
    8.31 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
    8.32 -            Class k = ConcurrentSkipListSet.class;
    8.33 -            mapOffset = UNSAFE.objectFieldOffset
    8.34 -                (k.getDeclaredField("m"));
    8.35 -        } catch (Exception e) {
    8.36 -            throw new Error(e);
    8.37 -        }
    8.38 +        this.m = map;
    8.39      }
    8.40  }
     9.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/CopyOnWriteArrayList.java	Sat Mar 19 11:01:40 2016 +0100
     9.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/CopyOnWriteArrayList.java	Sat Mar 19 12:51:03 2016 +0100
     9.3 @@ -36,7 +36,6 @@
     9.4  package java.util.concurrent;
     9.5  import java.util.*;
     9.6  import java.util.concurrent.locks.*;
     9.7 -import sun.misc.Unsafe;
     9.8  
     9.9  /**
    9.10   * A thread-safe variant of {@link java.util.ArrayList} in which all mutative
    9.11 @@ -80,7 +79,7 @@
    9.12      private static final long serialVersionUID = 8673264195747942595L;
    9.13  
    9.14      /** The lock protecting all mutators */
    9.15 -    transient final ReentrantLock lock = new ReentrantLock();
    9.16 +    transient ReentrantLock lock = new ReentrantLock();
    9.17  
    9.18      /** The array, accessed only via getArray/setArray. */
    9.19      private volatile transient Object[] array;
    9.20 @@ -1323,18 +1322,6 @@
    9.21  
    9.22      // Support for resetting lock while deserializing
    9.23      private void resetLock() {
    9.24 -        UNSAFE.putObjectVolatile(this, lockOffset, new ReentrantLock());
    9.25 -    }
    9.26 -    private static final sun.misc.Unsafe UNSAFE;
    9.27 -    private static final long lockOffset;
    9.28 -    static {
    9.29 -        try {
    9.30 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
    9.31 -            Class k = CopyOnWriteArrayList.class;
    9.32 -            lockOffset = UNSAFE.objectFieldOffset
    9.33 -                (k.getDeclaredField("lock"));
    9.34 -        } catch (Exception e) {
    9.35 -            throw new Error(e);
    9.36 -        }
    9.37 +        this.lock = new ReentrantLock();
    9.38      }
    9.39  }
    10.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/Exchanger.java	Sat Mar 19 11:01:40 2016 +0100
    10.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/Exchanger.java	Sat Mar 19 12:51:03 2016 +0100
    10.3 @@ -210,7 +210,7 @@
    10.4       */
    10.5  
    10.6      /** The number of CPUs, for sizing and spin control */
    10.7 -    private static final int NCPU = Runtime.getRuntime().availableProcessors();
    10.8 +    private static final int NCPU = 1;
    10.9  
   10.10      /**
   10.11       * The capacity of the arena.  Set to a value that provides more
    11.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/Executors.java	Sat Mar 19 11:01:40 2016 +0100
    11.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/Executors.java	Sat Mar 19 12:51:03 2016 +0100
    11.3 @@ -36,13 +36,9 @@
    11.4  package java.util.concurrent;
    11.5  import java.util.*;
    11.6  import java.util.concurrent.atomic.AtomicInteger;
    11.7 -import java.security.AccessControlContext;
    11.8  import java.security.AccessController;
    11.9  import java.security.PrivilegedAction;
   11.10  import java.security.PrivilegedExceptionAction;
   11.11 -import java.security.PrivilegedActionException;
   11.12 -import java.security.AccessControlException;
   11.13 -import sun.security.util.SecurityConstants;
   11.14  
   11.15  /**
   11.16   * Factory and utility methods for {@link Executor}, {@link
   11.17 @@ -350,7 +346,7 @@
   11.18       * class loader.
   11.19       */
   11.20      public static ThreadFactory privilegedThreadFactory() {
   11.21 -        return new PrivilegedThreadFactory();
   11.22 +        throw new SecurityException();
   11.23      }
   11.24  
   11.25      /**
   11.26 @@ -450,9 +446,7 @@
   11.27       * class loader.
   11.28       */
   11.29      public static <T> Callable<T> privilegedCallableUsingCurrentClassLoader(Callable<T> callable) {
   11.30 -        if (callable == null)
   11.31 -            throw new NullPointerException();
   11.32 -        return new PrivilegedCallableUsingCurrentClassLoader<T>(callable);
   11.33 +        throw new SecurityException();
   11.34      }
   11.35  
   11.36      // Non-public classes supporting the public methods
   11.37 @@ -478,76 +472,13 @@
   11.38       */
   11.39      static final class PrivilegedCallable<T> implements Callable<T> {
   11.40          private final Callable<T> task;
   11.41 -        private final AccessControlContext acc;
   11.42  
   11.43          PrivilegedCallable(Callable<T> task) {
   11.44              this.task = task;
   11.45 -            this.acc = AccessController.getContext();
   11.46          }
   11.47  
   11.48          public T call() throws Exception {
   11.49 -            try {
   11.50 -                return AccessController.doPrivileged(
   11.51 -                    new PrivilegedExceptionAction<T>() {
   11.52 -                        public T run() throws Exception {
   11.53 -                            return task.call();
   11.54 -                        }
   11.55 -                    }, acc);
   11.56 -            } catch (PrivilegedActionException e) {
   11.57 -                throw e.getException();
   11.58 -            }
   11.59 -        }
   11.60 -    }
   11.61 -
   11.62 -    /**
   11.63 -     * A callable that runs under established access control settings and
   11.64 -     * current ClassLoader
   11.65 -     */
   11.66 -    static final class PrivilegedCallableUsingCurrentClassLoader<T> implements Callable<T> {
   11.67 -        private final Callable<T> task;
   11.68 -        private final AccessControlContext acc;
   11.69 -        private final ClassLoader ccl;
   11.70 -
   11.71 -        PrivilegedCallableUsingCurrentClassLoader(Callable<T> task) {
   11.72 -            SecurityManager sm = System.getSecurityManager();
   11.73 -            if (sm != null) {
   11.74 -                // Calls to getContextClassLoader from this class
   11.75 -                // never trigger a security check, but we check
   11.76 -                // whether our callers have this permission anyways.
   11.77 -                sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
   11.78 -
   11.79 -                // Whether setContextClassLoader turns out to be necessary
   11.80 -                // or not, we fail fast if permission is not available.
   11.81 -                sm.checkPermission(new RuntimePermission("setContextClassLoader"));
   11.82 -            }
   11.83 -            this.task = task;
   11.84 -            this.acc = AccessController.getContext();
   11.85 -            this.ccl = Thread.currentThread().getContextClassLoader();
   11.86 -        }
   11.87 -
   11.88 -        public T call() throws Exception {
   11.89 -            try {
   11.90 -                return AccessController.doPrivileged(
   11.91 -                    new PrivilegedExceptionAction<T>() {
   11.92 -                        public T run() throws Exception {
   11.93 -                            ClassLoader savedcl = null;
   11.94 -                            Thread t = Thread.currentThread();
   11.95 -                            try {
   11.96 -                                ClassLoader cl = t.getContextClassLoader();
   11.97 -                                if (ccl != cl) {
   11.98 -                                    t.setContextClassLoader(ccl);
   11.99 -                                    savedcl = cl;
  11.100 -                                }
  11.101 -                                return task.call();
  11.102 -                            } finally {
  11.103 -                                if (savedcl != null)
  11.104 -                                    t.setContextClassLoader(savedcl);
  11.105 -                            }
  11.106 -                        }
  11.107 -                    }, acc);
  11.108 -            } catch (PrivilegedActionException e) {
  11.109 -                throw e.getException();
  11.110 -            }
  11.111 +            return task.call();
  11.112          }
  11.113      }
  11.114  
  11.115 @@ -556,23 +487,19 @@
  11.116       */
  11.117      static class DefaultThreadFactory implements ThreadFactory {
  11.118          private static final AtomicInteger poolNumber = new AtomicInteger(1);
  11.119 -        private final ThreadGroup group;
  11.120          private final AtomicInteger threadNumber = new AtomicInteger(1);
  11.121          private final String namePrefix;
  11.122  
  11.123          DefaultThreadFactory() {
  11.124 -            SecurityManager s = System.getSecurityManager();
  11.125 -            group = (s != null) ? s.getThreadGroup() :
  11.126 -                                  Thread.currentThread().getThreadGroup();
  11.127              namePrefix = "pool-" +
  11.128                            poolNumber.getAndIncrement() +
  11.129                           "-thread-";
  11.130          }
  11.131  
  11.132          public Thread newThread(Runnable r) {
  11.133 -            Thread t = new Thread(group, r,
  11.134 -                                  namePrefix + threadNumber.getAndIncrement(),
  11.135 -                                  0);
  11.136 +            Thread t = new Thread(r,
  11.137 +                                  namePrefix + threadNumber.getAndIncrement()
  11.138 +                                  );
  11.139              if (t.isDaemon())
  11.140                  t.setDaemon(false);
  11.141              if (t.getPriority() != Thread.NORM_PRIORITY)
  11.142 @@ -582,44 +509,6 @@
  11.143      }
  11.144  
  11.145      /**
  11.146 -     * Thread factory capturing access control context and class loader
  11.147 -     */
  11.148 -    static class PrivilegedThreadFactory extends DefaultThreadFactory {
  11.149 -        private final AccessControlContext acc;
  11.150 -        private final ClassLoader ccl;
  11.151 -
  11.152 -        PrivilegedThreadFactory() {
  11.153 -            super();
  11.154 -            SecurityManager sm = System.getSecurityManager();
  11.155 -            if (sm != null) {
  11.156 -                // Calls to getContextClassLoader from this class
  11.157 -                // never trigger a security check, but we check
  11.158 -                // whether our callers have this permission anyways.
  11.159 -                sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
  11.160 -
  11.161 -                // Fail fast
  11.162 -                sm.checkPermission(new RuntimePermission("setContextClassLoader"));
  11.163 -            }
  11.164 -            this.acc = AccessController.getContext();
  11.165 -            this.ccl = Thread.currentThread().getContextClassLoader();
  11.166 -        }
  11.167 -
  11.168 -        public Thread newThread(final Runnable r) {
  11.169 -            return super.newThread(new Runnable() {
  11.170 -                public void run() {
  11.171 -                    AccessController.doPrivileged(new PrivilegedAction<Void>() {
  11.172 -                        public Void run() {
  11.173 -                            Thread.currentThread().setContextClassLoader(ccl);
  11.174 -                            r.run();
  11.175 -                            return null;
  11.176 -                        }
  11.177 -                    }, acc);
  11.178 -                }
  11.179 -            });
  11.180 -        }
  11.181 -    }
  11.182 -
  11.183 -    /**
  11.184       * A wrapper class that exposes only the ExecutorService methods
  11.185       * of an ExecutorService implementation.
  11.186       */
    12.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ForkJoinPool.java	Sat Mar 19 11:01:40 2016 +0100
    12.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ForkJoinPool.java	Sat Mar 19 12:51:03 2016 +0100
    12.3 @@ -48,7 +48,6 @@
    12.4  import java.util.concurrent.RejectedExecutionException;
    12.5  import java.util.concurrent.RunnableFuture;
    12.6  import java.util.concurrent.TimeUnit;
    12.7 -import java.util.concurrent.TimeoutException;
    12.8  import java.util.concurrent.atomic.AtomicInteger;
    12.9  import java.util.concurrent.locks.LockSupport;
   12.10  import java.util.concurrent.locks.ReentrantLock;
   12.11 @@ -399,19 +398,11 @@
   12.12          defaultForkJoinWorkerThreadFactory;
   12.13  
   12.14      /**
   12.15 -     * Permission required for callers of methods that may start or
   12.16 -     * kill threads.
   12.17 -     */
   12.18 -    private static final RuntimePermission modifyThreadPermission;
   12.19 -
   12.20 -    /**
   12.21       * If there is a security manager, makes sure caller has
   12.22       * permission to modify threads.
   12.23       */
   12.24      private static void checkPermission() {
   12.25 -        SecurityManager security = System.getSecurityManager();
   12.26 -        if (security != null)
   12.27 -            security.checkPermission(modifyThreadPermission);
   12.28 +        throw new SecurityException();
   12.29      }
   12.30  
   12.31      /**
   12.32 @@ -1411,7 +1402,7 @@
   12.33       *         java.lang.RuntimePermission}{@code ("modifyThread")}
   12.34       */
   12.35      public ForkJoinPool() {
   12.36 -        this(Runtime.getRuntime().availableProcessors(),
   12.37 +        this(1,
   12.38               defaultForkJoinWorkerThreadFactory, null, false);
   12.39      }
   12.40  
   12.41 @@ -2131,7 +2122,6 @@
   12.42      }
   12.43  
   12.44      // Unsafe mechanics
   12.45 -    private static final sun.misc.Unsafe UNSAFE;
   12.46      private static final long ctlOffset;
   12.47      private static final long stealCountOffset;
   12.48      private static final long blockedCountOffset;
    13.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/LinkedTransferQueue.java	Sat Mar 19 11:01:40 2016 +0100
    13.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/LinkedTransferQueue.java	Sat Mar 19 12:51:03 2016 +0100
    13.3 @@ -408,8 +408,7 @@
    13.4       */
    13.5  
    13.6      /** True if on multiprocessor */
    13.7 -    private static final boolean MP =
    13.8 -        Runtime.getRuntime().availableProcessors() > 1;
    13.9 +    private static final boolean MP = false;
   13.10  
   13.11      /**
   13.12       * The number of times to spin (with randomly interspersed calls
   13.13 @@ -453,12 +452,19 @@
   13.14  
   13.15          // CAS methods for fields
   13.16          final boolean casNext(Node cmp, Node val) {
   13.17 -            return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
   13.18 +            if (next == cmp) {
   13.19 +                next = val;
   13.20 +                return true;
   13.21 +            }
   13.22 +            return false;
   13.23          }
   13.24  
   13.25          final boolean casItem(Object cmp, Object val) {
   13.26 -            // assert cmp == null || cmp.getClass() != Node.class;
   13.27 -            return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
   13.28 +            if (item == cmp) {
   13.29 +                item = val;
   13.30 +                return true;
   13.31 +            }
   13.32 +            return false;
   13.33          }
   13.34  
   13.35          /**
   13.36 @@ -466,7 +472,7 @@
   13.37           * only be seen after publication via casNext.
   13.38           */
   13.39          Node(Object item, boolean isData) {
   13.40 -            UNSAFE.putObject(this, itemOffset, item); // relaxed write
   13.41 +            this.item = item;
   13.42              this.isData = isData;
   13.43          }
   13.44  
   13.45 @@ -475,7 +481,7 @@
   13.46           * only after CASing head field, so uses relaxed write.
   13.47           */
   13.48          final void forgetNext() {
   13.49 -            UNSAFE.putObject(this, nextOffset, this);
   13.50 +            this.next = this;
   13.51          }
   13.52  
   13.53          /**
   13.54 @@ -488,8 +494,8 @@
   13.55           * else we don't care).
   13.56           */
   13.57          final void forgetContents() {
   13.58 -            UNSAFE.putObject(this, itemOffset, this);
   13.59 -            UNSAFE.putObject(this, waiterOffset, null);
   13.60 +            this.item = this;
   13.61 +            this.waiter = null;
   13.62          }
   13.63  
   13.64          /**
   13.65 @@ -533,26 +539,6 @@
   13.66          }
   13.67  
   13.68          private static final long serialVersionUID = -3375979862319811754L;
   13.69 -
   13.70 -        // Unsafe mechanics
   13.71 -        private static final sun.misc.Unsafe UNSAFE;
   13.72 -        private static final long itemOffset;
   13.73 -        private static final long nextOffset;
   13.74 -        private static final long waiterOffset;
   13.75 -        static {
   13.76 -            try {
   13.77 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
   13.78 -                Class k = Node.class;
   13.79 -                itemOffset = UNSAFE.objectFieldOffset
   13.80 -                    (k.getDeclaredField("item"));
   13.81 -                nextOffset = UNSAFE.objectFieldOffset
   13.82 -                    (k.getDeclaredField("next"));
   13.83 -                waiterOffset = UNSAFE.objectFieldOffset
   13.84 -                    (k.getDeclaredField("waiter"));
   13.85 -            } catch (Exception e) {
   13.86 -                throw new Error(e);
   13.87 -            }
   13.88 -        }
   13.89      }
   13.90  
   13.91      /** head of the queue; null until first enqueue */
   13.92 @@ -566,15 +552,27 @@
   13.93  
   13.94      // CAS methods for fields
   13.95      private boolean casTail(Node cmp, Node val) {
   13.96 -        return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
   13.97 +        if (tail == cmp) {
   13.98 +            tail = val;
   13.99 +            return true;
  13.100 +        }
  13.101 +        return false;
  13.102      }
  13.103  
  13.104      private boolean casHead(Node cmp, Node val) {
  13.105 -        return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
  13.106 +        if (head == cmp) {
  13.107 +            head = val;
  13.108 +            return true;
  13.109 +        }
  13.110 +        return false;
  13.111      }
  13.112  
  13.113      private boolean casSweepVotes(int cmp, int val) {
  13.114 -        return UNSAFE.compareAndSwapInt(this, sweepVotesOffset, cmp, val);
  13.115 +        if (sweepVotes == cmp) {
  13.116 +            sweepVotes = val;
  13.117 +            return true;
  13.118 +        }
  13.119 +        return false;
  13.120      }
  13.121  
  13.122      /*
  13.123 @@ -1327,25 +1325,4 @@
  13.124                  offer(item);
  13.125          }
  13.126      }
  13.127 -
  13.128 -    // Unsafe mechanics
  13.129 -
  13.130 -    private static final sun.misc.Unsafe UNSAFE;
  13.131 -    private static final long headOffset;
  13.132 -    private static final long tailOffset;
  13.133 -    private static final long sweepVotesOffset;
  13.134 -    static {
  13.135 -        try {
  13.136 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
  13.137 -            Class k = LinkedTransferQueue.class;
  13.138 -            headOffset = UNSAFE.objectFieldOffset
  13.139 -                (k.getDeclaredField("head"));
  13.140 -            tailOffset = UNSAFE.objectFieldOffset
  13.141 -                (k.getDeclaredField("tail"));
  13.142 -            sweepVotesOffset = UNSAFE.objectFieldOffset
  13.143 -                (k.getDeclaredField("sweepVotes"));
  13.144 -        } catch (Exception e) {
  13.145 -            throw new Error(e);
  13.146 -        }
  13.147 -    }
  13.148  }
    14.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/Phaser.java	Sat Mar 19 11:01:40 2016 +0100
    14.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/Phaser.java	Sat Mar 19 12:51:03 2016 +0100
    14.3 @@ -388,7 +388,7 @@
    14.4                  if (root == this || reconcileState() == s)
    14.5                      throw new IllegalStateException(badArrive(s));
    14.6              }
    14.7 -            else if (UNSAFE.compareAndSwapLong(this, stateOffset, s, s-=adj)) {
    14.8 +            else if (compareAndSwapLong(s, s-=adj)) {
    14.9                  if (unarrived == 0) {
   14.10                      long n = s & PARTIES_MASK;  // base of next state
   14.11                      int nextUnarrived = (int)n >>> PARTIES_SHIFT;
   14.12 @@ -401,7 +401,7 @@
   14.13                      else
   14.14                          n |= nextUnarrived;
   14.15                      n |= (long)((phase + 1) & MAX_PHASE) << PHASE_SHIFT;
   14.16 -                    UNSAFE.compareAndSwapLong(this, stateOffset, s, n);
   14.17 +                    compareAndSwapLong(s, n);
   14.18                      releaseWaiters(phase);
   14.19                  }
   14.20                  return phase;
   14.21 @@ -433,14 +433,13 @@
   14.22                  if (parent == null || reconcileState() == s) {
   14.23                      if (unarrived == 0)             // wait out advance
   14.24                          root.internalAwaitAdvance(phase, null);
   14.25 -                    else if (UNSAFE.compareAndSwapLong(this, stateOffset,
   14.26 -                                                       s, s + adj))
   14.27 +                    else if (compareAndSwapLong(                                                       s, s + adj))
   14.28                          break;
   14.29                  }
   14.30              }
   14.31              else if (parent == null) {              // 1st root registration
   14.32                  long next = ((long)phase << PHASE_SHIFT) | adj;
   14.33 -                if (UNSAFE.compareAndSwapLong(this, stateOffset, s, next))
   14.34 +                if (compareAndSwapLong(s, next))
   14.35                      break;
   14.36              }
   14.37              else {
   14.38 @@ -450,8 +449,8 @@
   14.39                          do {                        // force current phase
   14.40                              phase = (int)(root.state >>> PHASE_SHIFT);
   14.41                              // assert phase < 0 || (int)state == EMPTY;
   14.42 -                        } while (!UNSAFE.compareAndSwapLong
   14.43 -                                 (this, stateOffset, state,
   14.44 +                        } while (!compareAndSwapLong
   14.45 +                                 (state,
   14.46                                    ((long)phase << PHASE_SHIFT) | adj));
   14.47                          break;
   14.48                      }
   14.49 @@ -482,8 +481,8 @@
   14.50              // CAS root phase with current parties; possibly trip unarrived
   14.51              while ((phase = (int)(root.state >>> PHASE_SHIFT)) !=
   14.52                     (int)(s >>> PHASE_SHIFT) &&
   14.53 -                   !UNSAFE.compareAndSwapLong
   14.54 -                   (this, stateOffset, s,
   14.55 +                   !compareAndSwapLong
   14.56 +                   (s,
   14.57                      s = (((long)phase << PHASE_SHIFT) |
   14.58                           (s & PARTIES_MASK) |
   14.59                           ((p = (int)s >>> PARTIES_SHIFT) == 0 ? EMPTY :
   14.60 @@ -674,7 +673,7 @@
   14.61                  if (reconcileState() == s)
   14.62                      throw new IllegalStateException(badArrive(s));
   14.63              }
   14.64 -            else if (UNSAFE.compareAndSwapLong(this, stateOffset, s,
   14.65 +            else if (compareAndSwapLong(s,
   14.66                                                 s -= ONE_ARRIVAL)) {
   14.67                  if (unarrived != 0)
   14.68                      return root.internalAwaitAdvance(phase, null);
   14.69 @@ -690,7 +689,7 @@
   14.70                      n |= nextUnarrived;
   14.71                  int nextPhase = (phase + 1) & MAX_PHASE;
   14.72                  n |= (long)nextPhase << PHASE_SHIFT;
   14.73 -                if (!UNSAFE.compareAndSwapLong(this, stateOffset, s, n))
   14.74 +                if (!compareAndSwapLong(s, n))
   14.75                      return (int)(state >>> PHASE_SHIFT); // terminated
   14.76                  releaseWaiters(phase);
   14.77                  return nextPhase;
   14.78 @@ -806,8 +805,7 @@
   14.79          final Phaser root = this.root;
   14.80          long s;
   14.81          while ((s = root.state) >= 0) {
   14.82 -            if (UNSAFE.compareAndSwapLong(root, stateOffset,
   14.83 -                                          s, s | TERMINATION_BIT)) {
   14.84 +            if (compareAndSwapLong(                                          s, s | TERMINATION_BIT)) {
   14.85                  // signal all threads
   14.86                  releaseWaiters(0);
   14.87                  releaseWaiters(1);
   14.88 @@ -999,7 +997,7 @@
   14.89      }
   14.90  
   14.91      /** The number of CPUs, for spin control */
   14.92 -    private static final int NCPU = Runtime.getRuntime().availableProcessors();
   14.93 +    private static final int NCPU = 1;
   14.94  
   14.95      /**
   14.96       * The number of times to spin before blocking while waiting for
   14.97 @@ -1072,6 +1070,14 @@
   14.98          return p;
   14.99      }
  14.100  
  14.101 +    private boolean compareAndSwapLong(long s, long l) {
  14.102 +        if (this.state == s) {
  14.103 +            this.state = l;
  14.104 +            return true;
  14.105 +        }
  14.106 +        return false;
  14.107 +    }
  14.108 +
  14.109      /**
  14.110       * Wait nodes for Treiber stack representing wait queue
  14.111       */
  14.112 @@ -1134,19 +1140,4 @@
  14.113              return isReleasable();
  14.114          }
  14.115      }
  14.116 -
  14.117 -    // Unsafe mechanics
  14.118 -
  14.119 -    private static final sun.misc.Unsafe UNSAFE;
  14.120 -    private static final long stateOffset;
  14.121 -    static {
  14.122 -        try {
  14.123 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
  14.124 -            Class k = Phaser.class;
  14.125 -            stateOffset = UNSAFE.objectFieldOffset
  14.126 -                (k.getDeclaredField("state"));
  14.127 -        } catch (Exception e) {
  14.128 -            throw new Error(e);
  14.129 -        }
  14.130 -    }
  14.131  }
    15.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/PriorityBlockingQueue.java	Sat Mar 19 11:01:40 2016 +0100
    15.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/PriorityBlockingQueue.java	Sat Mar 19 12:51:03 2016 +0100
    15.3 @@ -276,9 +276,8 @@
    15.4      private void tryGrow(Object[] array, int oldCap) {
    15.5          lock.unlock(); // must release and then re-acquire main lock
    15.6          Object[] newArray = null;
    15.7 -        if (allocationSpinLock == 0 &&
    15.8 -            UNSAFE.compareAndSwapInt(this, allocationSpinLockOffset,
    15.9 -                                     0, 1)) {
   15.10 +        if (allocationSpinLock == 0) {
   15.11 +            allocationSpinLock = 1;
   15.12              try {
   15.13                  int newCap = oldCap + ((oldCap < 64) ?
   15.14                                         (oldCap + 2) : // grow faster if small
   15.15 @@ -961,18 +960,4 @@
   15.16              q = null;
   15.17          }
   15.18      }
   15.19 -
   15.20 -    // Unsafe mechanics
   15.21 -    private static final sun.misc.Unsafe UNSAFE;
   15.22 -    private static final long allocationSpinLockOffset;
   15.23 -    static {
   15.24 -        try {
   15.25 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
   15.26 -            Class k = PriorityBlockingQueue.class;
   15.27 -            allocationSpinLockOffset = UNSAFE.objectFieldOffset
   15.28 -                (k.getDeclaredField("allocationSpinLock"));
   15.29 -        } catch (Exception e) {
   15.30 -            throw new Error(e);
   15.31 -        }
   15.32 -    }
   15.33  }
    16.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/SynchronousQueue.java	Sat Mar 19 11:01:40 2016 +0100
    16.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/SynchronousQueue.java	Sat Mar 19 12:51:03 2016 +0100
    16.3 @@ -36,7 +36,6 @@
    16.4  
    16.5  package java.util.concurrent;
    16.6  import java.util.concurrent.locks.*;
    16.7 -import java.util.concurrent.atomic.*;
    16.8  import java.util.*;
    16.9  
   16.10  /**
   16.11 @@ -181,7 +180,7 @@
   16.12      }
   16.13  
   16.14      /** The number of CPUs, for spin control */
   16.15 -    static final int NCPUS = Runtime.getRuntime().availableProcessors();
   16.16 +    static final int NCPUS = 1;
   16.17  
   16.18      /**
   16.19       * The number of times to spin before blocking in timed waits.
   16.20 @@ -242,8 +241,11 @@
   16.21              }
   16.22  
   16.23              boolean casNext(SNode cmp, SNode val) {
   16.24 -                return cmp == next &&
   16.25 -                    UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
   16.26 +                if (next == cmp) {
   16.27 +                    next = val;
   16.28 +                    return true;
   16.29 +                }
   16.30 +                return false;
   16.31              }
   16.32  
   16.33              /**
   16.34 @@ -255,8 +257,8 @@
   16.35               * @return true if successfully matched to s
   16.36               */
   16.37              boolean tryMatch(SNode s) {
   16.38 -                if (match == null &&
   16.39 -                    UNSAFE.compareAndSwapObject(this, matchOffset, null, s)) {
   16.40 +                if (match == null) {
   16.41 +                    match = s;
   16.42                      Thread w = waiter;
   16.43                      if (w != null) {    // waiters need at most one unpark
   16.44                          waiter = null;
   16.45 @@ -271,38 +273,25 @@
   16.46               * Tries to cancel a wait by matching node to itself.
   16.47               */
   16.48              void tryCancel() {
   16.49 -                UNSAFE.compareAndSwapObject(this, matchOffset, null, this);
   16.50 +                if (match == null) {
   16.51 +                    match = this;
   16.52 +                }
   16.53              }
   16.54  
   16.55              boolean isCancelled() {
   16.56                  return match == this;
   16.57              }
   16.58 -
   16.59 -            // Unsafe mechanics
   16.60 -            private static final sun.misc.Unsafe UNSAFE;
   16.61 -            private static final long matchOffset;
   16.62 -            private static final long nextOffset;
   16.63 -
   16.64 -            static {
   16.65 -                try {
   16.66 -                    UNSAFE = sun.misc.Unsafe.getUnsafe();
   16.67 -                    Class k = SNode.class;
   16.68 -                    matchOffset = UNSAFE.objectFieldOffset
   16.69 -                        (k.getDeclaredField("match"));
   16.70 -                    nextOffset = UNSAFE.objectFieldOffset
   16.71 -                        (k.getDeclaredField("next"));
   16.72 -                } catch (Exception e) {
   16.73 -                    throw new Error(e);
   16.74 -                }
   16.75 -            }
   16.76          }
   16.77  
   16.78          /** The head (top) of the stack */
   16.79          volatile SNode head;
   16.80  
   16.81          boolean casHead(SNode h, SNode nh) {
   16.82 -            return h == head &&
   16.83 -                UNSAFE.compareAndSwapObject(this, headOffset, h, nh);
   16.84 +            if (head == h) {
   16.85 +                head = nh;
   16.86 +                return true;
   16.87 +            }
   16.88 +            return false;
   16.89          }
   16.90  
   16.91          /**
   16.92 @@ -506,20 +495,6 @@
   16.93                      p = n;
   16.94              }
   16.95          }
   16.96 -
   16.97 -        // Unsafe mechanics
   16.98 -        private static final sun.misc.Unsafe UNSAFE;
   16.99 -        private static final long headOffset;
  16.100 -        static {
  16.101 -            try {
  16.102 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
  16.103 -                Class k = TransferStack.class;
  16.104 -                headOffset = UNSAFE.objectFieldOffset
  16.105 -                    (k.getDeclaredField("head"));
  16.106 -            } catch (Exception e) {
  16.107 -                throw new Error(e);
  16.108 -            }
  16.109 -        }
  16.110      }
  16.111  
  16.112      /** Dual Queue */
  16.113 @@ -546,20 +521,28 @@
  16.114              }
  16.115  
  16.116              boolean casNext(QNode cmp, QNode val) {
  16.117 -                return next == cmp &&
  16.118 -                    UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
  16.119 +                if (next == cmp) {
  16.120 +                    next = val;
  16.121 +                    return true;
  16.122 +                }
  16.123 +                return false;
  16.124              }
  16.125  
  16.126              boolean casItem(Object cmp, Object val) {
  16.127 -                return item == cmp &&
  16.128 -                    UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
  16.129 +                if (item == cmp) {
  16.130 +                    item = val;
  16.131 +                    return true;
  16.132 +                }
  16.133 +                return false;
  16.134              }
  16.135  
  16.136              /**
  16.137               * Tries to cancel by CAS'ing ref to this as item.
  16.138               */
  16.139              void tryCancel(Object cmp) {
  16.140 -                UNSAFE.compareAndSwapObject(this, itemOffset, cmp, this);
  16.141 +                if (item == cmp) {
  16.142 +                    item = this;
  16.143 +                }
  16.144              }
  16.145  
  16.146              boolean isCancelled() {
  16.147 @@ -574,24 +557,6 @@
  16.148              boolean isOffList() {
  16.149                  return next == this;
  16.150              }
  16.151 -
  16.152 -            // Unsafe mechanics
  16.153 -            private static final sun.misc.Unsafe UNSAFE;
  16.154 -            private static final long itemOffset;
  16.155 -            private static final long nextOffset;
  16.156 -
  16.157 -            static {
  16.158 -                try {
  16.159 -                    UNSAFE = sun.misc.Unsafe.getUnsafe();
  16.160 -                    Class k = QNode.class;
  16.161 -                    itemOffset = UNSAFE.objectFieldOffset
  16.162 -                        (k.getDeclaredField("item"));
  16.163 -                    nextOffset = UNSAFE.objectFieldOffset
  16.164 -                        (k.getDeclaredField("next"));
  16.165 -                } catch (Exception e) {
  16.166 -                    throw new Error(e);
  16.167 -                }
  16.168 -            }
  16.169          }
  16.170  
  16.171          /** Head of queue */
  16.172 @@ -616,25 +581,30 @@
  16.173           * old head's next node to avoid garbage retention.
  16.174           */
  16.175          void advanceHead(QNode h, QNode nh) {
  16.176 -            if (h == head &&
  16.177 -                UNSAFE.compareAndSwapObject(this, headOffset, h, nh))
  16.178 +            if (head == h) {
  16.179 +                head = nh;
  16.180                  h.next = h; // forget old next
  16.181 +            }
  16.182          }
  16.183  
  16.184          /**
  16.185           * Tries to cas nt as new tail.
  16.186           */
  16.187          void advanceTail(QNode t, QNode nt) {
  16.188 -            if (tail == t)
  16.189 -                UNSAFE.compareAndSwapObject(this, tailOffset, t, nt);
  16.190 +            if (tail == t) {
  16.191 +                tail = nt;
  16.192 +            }
  16.193          }
  16.194  
  16.195          /**
  16.196           * Tries to CAS cleanMe slot.
  16.197           */
  16.198          boolean casCleanMe(QNode cmp, QNode val) {
  16.199 -            return cleanMe == cmp &&
  16.200 -                UNSAFE.compareAndSwapObject(this, cleanMeOffset, cmp, val);
  16.201 +            if (cleanMe == cmp) {
  16.202 +                cleanMe = val;
  16.203 +                return true;
  16.204 +            }
  16.205 +            return false;
  16.206          }
  16.207  
  16.208          /**
  16.209 @@ -819,25 +789,6 @@
  16.210                      return;          // Postpone cleaning s
  16.211              }
  16.212          }
  16.213 -
  16.214 -        private static final sun.misc.Unsafe UNSAFE;
  16.215 -        private static final long headOffset;
  16.216 -        private static final long tailOffset;
  16.217 -        private static final long cleanMeOffset;
  16.218 -        static {
  16.219 -            try {
  16.220 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
  16.221 -                Class k = TransferQueue.class;
  16.222 -                headOffset = UNSAFE.objectFieldOffset
  16.223 -                    (k.getDeclaredField("head"));
  16.224 -                tailOffset = UNSAFE.objectFieldOffset
  16.225 -                    (k.getDeclaredField("tail"));
  16.226 -                cleanMeOffset = UNSAFE.objectFieldOffset
  16.227 -                    (k.getDeclaredField("cleanMe"));
  16.228 -            } catch (Exception e) {
  16.229 -                throw new Error(e);
  16.230 -            }
  16.231 -        }
  16.232      }
  16.233  
  16.234      /**
  16.235 @@ -1180,17 +1131,5 @@
  16.236              transferer = new TransferStack();
  16.237      }
  16.238  
  16.239 -    // Unsafe mechanics
  16.240 -    static long objectFieldOffset(sun.misc.Unsafe UNSAFE,
  16.241 -                                  String field, Class<?> klazz) {
  16.242 -        try {
  16.243 -            return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
  16.244 -        } catch (NoSuchFieldException e) {
  16.245 -            // Convert Exception to corresponding Error
  16.246 -            NoSuchFieldError error = new NoSuchFieldError(field);
  16.247 -            error.initCause(e);
  16.248 -            throw error;
  16.249 -        }
  16.250 -    }
  16.251  
  16.252  }
    17.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ThreadPoolExecutor.java	Sat Mar 19 11:01:40 2016 +0100
    17.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ThreadPoolExecutor.java	Sat Mar 19 12:51:03 2016 +0100
    17.3 @@ -557,8 +557,8 @@
    17.4       * and failure to actually interrupt will merely delay response to
    17.5       * configuration changes so is not handled exceptionally.
    17.6       */
    17.7 -    private static final RuntimePermission shutdownPerm =
    17.8 -        new RuntimePermission("modifyThread");
    17.9 +//    private static final RuntimePermission shutdownPerm =
   17.10 +//        new RuntimePermission("modifyThread");
   17.11  
   17.12      /**
   17.13       * Class Worker mainly maintains interrupt control state for
   17.14 @@ -706,18 +706,18 @@
   17.15       * specially.
   17.16       */
   17.17      private void checkShutdownAccess() {
   17.18 -        SecurityManager security = System.getSecurityManager();
   17.19 -        if (security != null) {
   17.20 -            security.checkPermission(shutdownPerm);
   17.21 -            final ReentrantLock mainLock = this.mainLock;
   17.22 -            mainLock.lock();
   17.23 -            try {
   17.24 -                for (Worker w : workers)
   17.25 -                    security.checkAccess(w.thread);
   17.26 -            } finally {
   17.27 -                mainLock.unlock();
   17.28 -            }
   17.29 -        }
   17.30 +//        SecurityManager security = System.getSecurityManager();
   17.31 +//        if (security != null) {
   17.32 +//            security.checkPermission(shutdownPerm);
   17.33 +//            final ReentrantLock mainLock = this.mainLock;
   17.34 +//            mainLock.lock();
   17.35 +//            try {
   17.36 +//                for (Worker w : workers)
   17.37 +//                    security.checkAccess(w.thread);
   17.38 +//            } finally {
   17.39 +//                mainLock.unlock();
   17.40 +//            }
   17.41 +//        }
   17.42      }
   17.43  
   17.44      /**
    18.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/TimeUnit.java	Sat Mar 19 11:01:40 2016 +0100
    18.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/TimeUnit.java	Sat Mar 19 12:51:03 2016 +0100
    18.3 @@ -362,6 +362,3 @@
    18.4      }
    18.5  
    18.6  }
    18.7 -    }
    18.8 -
    18.9 -}