923 };
924
925 for (Deque<?> q : qs) {
926 assertFalse(q.contains(null));
927 try {
928 assertFalse(q.remove(null));
929 shouldThrow();
930 } catch (NullPointerException success) {}
931 try {
932 assertFalse(q.removeFirstOccurrence(null));
933 shouldThrow();
934 } catch (NullPointerException success) {}
935 try {
936 assertFalse(q.removeLastOccurrence(null));
937 shouldThrow();
938 } catch (NullPointerException success) {}
939 }
940 }
941
942 void runAsync(Runnable r1, Runnable r2) {
943 boolean b = ThreadLocalRandom.current().nextBoolean();
944 CompletableFuture<Void> f1 = CompletableFuture.runAsync(b ? r1 : r2);
945 CompletableFuture<Void> f2 = CompletableFuture.runAsync(b ? r2 : r1);
946 f1.join();
947 f2.join();
948 }
949
950 /**
951 * Non-traversing Deque operations are linearizable.
952 * https://bugs.openjdk.java.net/browse/JDK-8188900
953 * ant -Djsr166.expensiveTests=true -Djsr166.tckTestClass=ConcurrentLinkedDequeTest -Djsr166.methodFilter=testBug8188900 tck
954 */
955 public void testBug8188900() {
956 final ThreadLocalRandom rnd = ThreadLocalRandom.current();
957 final LongAdder nulls = new LongAdder(), zeros = new LongAdder();
958 for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
959 ConcurrentLinkedDeque<Integer> d = new ConcurrentLinkedDeque<>();
960
961 boolean peek = rnd.nextBoolean();
962 Runnable getter = () -> {
963 Integer x = peek ? d.peekFirst() : d.pollFirst();
984 final LongAdder nulls = new LongAdder(), zeros = new LongAdder();
985 for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
986 ConcurrentLinkedDeque<Integer> d = new ConcurrentLinkedDeque<>();
987
988 boolean peek = rnd.nextBoolean();
989 Runnable getter = () -> {
990 Integer x = peek ? d.peekLast() : d.pollLast();
991 if (x == null) nulls.increment();
992 else if (x == 0) zeros.increment();
993 else
994 throw new AssertionError(
995 String.format(
996 "unexpected value %d after %d nulls and %d zeros",
997 x, nulls.sum(), zeros.sum()));
998 };
999
1000 Runnable adder = () -> { d.addLast(0); d.addFirst(42); };
1001
1002 runAsync(getter, adder);
1003 }
1004 }
1005
1006 <T> T chooseRandomly(T... choices) {
1007 return choices[ThreadLocalRandom.current().nextInt(choices.length)];
1008 }
1009
1010 /**
1011 * Non-traversing Deque operations (that return null) are linearizable.
1012 * Don't return null when the deque is observably never empty.
1013 * https://bugs.openjdk.java.net/browse/JDK-8189387
1014 * ant -Djsr166.expensiveTests=true -Djsr166.tckTestClass=ConcurrentLinkedDequeTest -Djsr166.methodFilter=testBug8189387 tck
1015 */
1016 public void testBug8189387() {
1017 final ThreadLocalRandom rnd = ThreadLocalRandom.current();
1018 Object x = new Object();
1019 for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
1020 ConcurrentLinkedDeque<Object> d = new ConcurrentLinkedDeque<>();
1021 Runnable add = chooseRandomly(
1022 () -> d.addFirst(x),
1023 () -> d.offerFirst(x),
1024 () -> d.addLast(x),
1025 () -> d.offerLast(x));
1026
1027 Runnable get = chooseRandomly(
|
923 };
924
925 for (Deque<?> q : qs) {
926 assertFalse(q.contains(null));
927 try {
928 assertFalse(q.remove(null));
929 shouldThrow();
930 } catch (NullPointerException success) {}
931 try {
932 assertFalse(q.removeFirstOccurrence(null));
933 shouldThrow();
934 } catch (NullPointerException success) {}
935 try {
936 assertFalse(q.removeLastOccurrence(null));
937 shouldThrow();
938 } catch (NullPointerException success) {}
939 }
940 }
941
942 void runAsync(Runnable r1, Runnable r2) {
943 boolean b = randomBoolean();
944 CompletableFuture<Void> f1 = CompletableFuture.runAsync(b ? r1 : r2);
945 CompletableFuture<Void> f2 = CompletableFuture.runAsync(b ? r2 : r1);
946 f1.join();
947 f2.join();
948 }
949
950 /**
951 * Non-traversing Deque operations are linearizable.
952 * https://bugs.openjdk.java.net/browse/JDK-8188900
953 * ant -Djsr166.expensiveTests=true -Djsr166.tckTestClass=ConcurrentLinkedDequeTest -Djsr166.methodFilter=testBug8188900 tck
954 */
955 public void testBug8188900() {
956 final ThreadLocalRandom rnd = ThreadLocalRandom.current();
957 final LongAdder nulls = new LongAdder(), zeros = new LongAdder();
958 for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
959 ConcurrentLinkedDeque<Integer> d = new ConcurrentLinkedDeque<>();
960
961 boolean peek = rnd.nextBoolean();
962 Runnable getter = () -> {
963 Integer x = peek ? d.peekFirst() : d.pollFirst();
984 final LongAdder nulls = new LongAdder(), zeros = new LongAdder();
985 for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
986 ConcurrentLinkedDeque<Integer> d = new ConcurrentLinkedDeque<>();
987
988 boolean peek = rnd.nextBoolean();
989 Runnable getter = () -> {
990 Integer x = peek ? d.peekLast() : d.pollLast();
991 if (x == null) nulls.increment();
992 else if (x == 0) zeros.increment();
993 else
994 throw new AssertionError(
995 String.format(
996 "unexpected value %d after %d nulls and %d zeros",
997 x, nulls.sum(), zeros.sum()));
998 };
999
1000 Runnable adder = () -> { d.addLast(0); d.addFirst(42); };
1001
1002 runAsync(getter, adder);
1003 }
1004 }
1005
1006 /**
1007 * Non-traversing Deque operations (that return null) are linearizable.
1008 * Don't return null when the deque is observably never empty.
1009 * https://bugs.openjdk.java.net/browse/JDK-8189387
1010 * ant -Djsr166.expensiveTests=true -Djsr166.tckTestClass=ConcurrentLinkedDequeTest -Djsr166.methodFilter=testBug8189387 tck
1011 */
1012 public void testBug8189387() {
1013 final ThreadLocalRandom rnd = ThreadLocalRandom.current();
1014 Object x = new Object();
1015 for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
1016 ConcurrentLinkedDeque<Object> d = new ConcurrentLinkedDeque<>();
1017 Runnable add = chooseRandomly(
1018 () -> d.addFirst(x),
1019 () -> d.offerFirst(x),
1020 () -> d.addLast(x),
1021 () -> d.offerLast(x));
1022
1023 Runnable get = chooseRandomly(
|