344 return bos.toByteArray();
345 } catch (Exception fail) {
346 throw new AssertionError(fail);
347 }
348 }
349
350 @SuppressWarnings("unchecked")
351 <T> T serialClone(T o) {
352 try {
353 ObjectInputStream ois = new ObjectInputStream
354 (new ByteArrayInputStream(serialBytes(o)));
355 T clone = (T) ois.readObject();
356 assertNotSame(o, clone);
357 assertSame(o.getClass(), clone.getClass());
358 return clone;
359 } catch (Exception fail) {
360 throw new AssertionError(fail);
361 }
362 }
363
364 public void testSerialization() {
365 LinkedTransferQueue q = serialClone(new LinkedTransferQueue());
366 assertInvariants(q);
367 }
368
369 public void cancelledNodeSweeping() throws Throwable {
370 assertEquals(SWEEP_THRESHOLD & (SWEEP_THRESHOLD - 1), 0);
371 LinkedTransferQueue q = new LinkedTransferQueue();
372 Thread blockHead = null;
373 if (rnd.nextBoolean()) {
374 blockHead = new Thread(
375 () -> { try { q.take(); } catch (InterruptedException ok) {}});
376 blockHead.start();
377 while (nodeCount(q) != 2) { Thread.yield(); }
378 assertTrue(q.hasWaitingConsumer());
379 assertEquals(q.getWaitingConsumerCount(), 1);
380 }
381 int initialNodeCount = nodeCount(q);
382
383 // Some dead nodes do in fact accumulate ...
|
344 return bos.toByteArray();
345 } catch (Exception fail) {
346 throw new AssertionError(fail);
347 }
348 }
349
350 @SuppressWarnings("unchecked")
351 <T> T serialClone(T o) {
352 try {
353 ObjectInputStream ois = new ObjectInputStream
354 (new ByteArrayInputStream(serialBytes(o)));
355 T clone = (T) ois.readObject();
356 assertNotSame(o, clone);
357 assertSame(o.getClass(), clone.getClass());
358 return clone;
359 } catch (Exception fail) {
360 throw new AssertionError(fail);
361 }
362 }
363
364 @Test
365 public void testSerialization() {
366 LinkedTransferQueue q = serialClone(new LinkedTransferQueue());
367 assertInvariants(q);
368 }
369
370 public void cancelledNodeSweeping() throws Throwable {
371 assertEquals(SWEEP_THRESHOLD & (SWEEP_THRESHOLD - 1), 0);
372 LinkedTransferQueue q = new LinkedTransferQueue();
373 Thread blockHead = null;
374 if (rnd.nextBoolean()) {
375 blockHead = new Thread(
376 () -> { try { q.take(); } catch (InterruptedException ok) {}});
377 blockHead.start();
378 while (nodeCount(q) != 2) { Thread.yield(); }
379 assertTrue(q.hasWaitingConsumer());
380 assertEquals(q.getWaitingConsumerCount(), 1);
381 }
382 int initialNodeCount = nodeCount(q);
383
384 // Some dead nodes do in fact accumulate ...
|