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 -}