ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentLinkedDequeTest.java
(Generate patch)

Comparing jsr166/src/test/tck/ConcurrentLinkedDequeTest.java (file contents):
Revision 1.29 by jsr166, Fri Aug 4 03:30:21 2017 UTC vs.
Revision 1.30 by jsr166, Tue Oct 10 05:54:41 2017 UTC

# Line 13 | Line 13 | import java.util.Iterator;
13   import java.util.NoSuchElementException;
14   import java.util.Queue;
15   import java.util.Random;
16 + import java.util.concurrent.CompletableFuture;
17   import java.util.concurrent.ConcurrentLinkedDeque;
18 + import java.util.concurrent.ThreadLocalRandom;
19 + import java.util.concurrent.atomic.LongAdder;
20  
21   import junit.framework.Test;
22  
# Line 905 | Line 908 | public class ConcurrentLinkedDequeTest e
908              } catch (NullPointerException success) {}
909          }
910      }
911 +
912 +    /**
913 +     * Non-traversing Deque operations are linearizable.
914 +     * https://bugs.openjdk.java.net/browse/JDK-8188900
915 +     * ant -Djsr166.expensiveTests=true -Djsr166.tckTestClass=ConcurrentLinkedDequeTest -Djsr166.methodFilter=testBug8188900 tck
916 +     */
917 +    public void testBug8188900() {
918 +        final ThreadLocalRandom rnd = ThreadLocalRandom.current();
919 +        final LongAdder nulls = new LongAdder(), zeros = new LongAdder();
920 +        for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
921 +            ConcurrentLinkedDeque<Integer> d = new ConcurrentLinkedDeque<>();
922 +
923 +            boolean peek = rnd.nextBoolean();
924 +            Runnable getter = () -> {
925 +                Integer x = peek ? d.peekFirst() : d.pollFirst();
926 +                if (x == null) nulls.increment();
927 +                else if (x == 0) zeros.increment();
928 +                else
929 +                    throw new AssertionError(
930 +                        String.format(
931 +                            "unexpected value %d after %d nulls and %d zeros",
932 +                            x, nulls.sum(), zeros.sum()));
933 +            };
934 +
935 +            Runnable adder = () -> {
936 +                d.addFirst(0);
937 +                d.addLast(42);
938 +            };
939 +
940 +            boolean b = rnd.nextBoolean();
941 +            Runnable r1 = b ? getter : adder;
942 +            Runnable r2 = b ? adder : getter;
943 +            CompletableFuture<Void> f1 = CompletableFuture.runAsync(r1);
944 +            CompletableFuture<Void> f2 = CompletableFuture.runAsync(r2);
945 +            f1.join();
946 +            f2.join();
947 +        }
948 +    }
949 +
950 +    /**
951 +     * Reverse direction variant of testBug8188900
952 +     */
953 +    public void testBug8188900_reverse() {
954 +        final ThreadLocalRandom rnd = ThreadLocalRandom.current();
955 +        final LongAdder nulls = new LongAdder(), zeros = new LongAdder();
956 +        for (int n = expensiveTests ? 100_000 : 10; n--> 0; ) {
957 +            ConcurrentLinkedDeque<Integer> d = new ConcurrentLinkedDeque<>();
958 +
959 +            boolean peek = rnd.nextBoolean();
960 +            Runnable getter = () -> {
961 +                Integer x = peek ? d.peekLast() : d.pollLast();
962 +                if (x == null) nulls.increment();
963 +                else if (x == 0) zeros.increment();
964 +                else
965 +                    throw new AssertionError(
966 +                        String.format(
967 +                            "unexpected value %d after %d nulls and %d zeros",
968 +                            x, nulls.sum(), zeros.sum()));
969 +            };
970 +
971 +            Runnable adder = () -> {
972 +                d.addLast(0);
973 +                d.addFirst(42);
974 +            };
975 +
976 +            boolean b = rnd.nextBoolean();
977 +            Runnable r1 = b ? getter : adder;
978 +            Runnable r2 = b ? adder : getter;
979 +            CompletableFuture<Void> f1 = CompletableFuture.runAsync(r1);
980 +            CompletableFuture<Void> f2 = CompletableFuture.runAsync(r2);
981 +            f1.join();
982 +            f2.join();
983 +        }
984 +    }
985   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines