< prev index next >

test/jdk/java/util/concurrent/LinkedTransferQueue/WhiteBox.java

Print this page
8246677: LinkedTransferQueue and SynchronousQueue synchronization updates
Reviewed-by: martin

*** 59,82 **** @Test public class WhiteBox { final ThreadLocalRandom rnd = ThreadLocalRandom.current(); final VarHandle HEAD, TAIL, ITEM, NEXT; - final int SWEEP_THRESHOLD; public WhiteBox() throws ReflectiveOperationException { Class<?> qClass = LinkedTransferQueue.class; Class<?> nodeClass = Class.forName(qClass.getName() + "$Node"); MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(qClass, MethodHandles.lookup()); HEAD = lookup.findVarHandle(qClass, "head", nodeClass); TAIL = lookup.findVarHandle(qClass, "tail", nodeClass); NEXT = lookup.findVarHandle(nodeClass, "next", nodeClass); ITEM = lookup.findVarHandle(nodeClass, "item", Object.class); - SWEEP_THRESHOLD = (int) - lookup.findStaticVarHandle(qClass, "SWEEP_THRESHOLD", int.class) - .get(); } Object head(LinkedTransferQueue q) { return HEAD.getVolatile(q); } Object tail(LinkedTransferQueue q) { return TAIL.getVolatile(q); } Object item(Object node) { return ITEM.getVolatile(node); } --- 59,78 ----
*** 365,404 **** public void testSerialization() { LinkedTransferQueue q = serialClone(new LinkedTransferQueue()); assertInvariants(q); } - public void cancelledNodeSweeping() throws Throwable { - assertEquals(SWEEP_THRESHOLD & (SWEEP_THRESHOLD - 1), 0); - LinkedTransferQueue q = new LinkedTransferQueue(); - Thread blockHead = null; - if (rnd.nextBoolean()) { - blockHead = new Thread( - () -> { try { q.take(); } catch (InterruptedException ok) {}}); - blockHead.start(); - while (nodeCount(q) != 2) { Thread.yield(); } - assertTrue(q.hasWaitingConsumer()); - assertEquals(q.getWaitingConsumerCount(), 1); - } - int initialNodeCount = nodeCount(q); - - // Some dead nodes do in fact accumulate ... - if (blockHead != null) - while (nodeCount(q) < initialNodeCount + SWEEP_THRESHOLD / 2) - q.poll(1L, TimeUnit.MICROSECONDS); - - // ... but no more than SWEEP_THRESHOLD nodes accumulate - for (int i = rnd.nextInt(SWEEP_THRESHOLD * 10); i-->0; ) - q.poll(1L, TimeUnit.MICROSECONDS); - assertTrue(nodeCount(q) <= initialNodeCount + SWEEP_THRESHOLD); - - if (blockHead != null) { - blockHead.interrupt(); - blockHead.join(); - } - } - /** Checks conditions which should always be true. */ void assertInvariants(LinkedTransferQueue q) { assertNotNull(head(q)); assertNotNull(tail(q)); // head is never self-linked (but tail may!) --- 361,370 ----
< prev index next >