18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/* 28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166 38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at 48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/ 58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include John Vint 68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166; 98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS; 118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList; 138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.List; 148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch; 158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Phaser; 168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.TimeoutException; 178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicInteger; 188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test; 208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite; 218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class PhaserTest extends JSR166TestCase { 238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // android-note: Removed because the CTS runner does a bad job of 258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // retrying tests that have suite() declarations. 268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static void main(String[] args) { 288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // main(suite(), args); 298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static Test suite() { 318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // return new TestSuite(...); 328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private static final int maxParties = 65535; 358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** Checks state of unterminated phaser. */ 378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void assertState(Phaser phaser, 388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int phase, int parties, int unarrived) { 398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(phase, phaser.getPhase()); 408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(parties, phaser.getRegisteredParties()); 418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(unarrived, phaser.getUnarrivedParties()); 428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(parties - unarrived, phaser.getArrivedParties()); 438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(phaser.isTerminated()); 448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** Checks state of terminated phaser. */ 478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void assertTerminated(Phaser phaser, int maxPhase, int parties) { 488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.isTerminated()); 498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int expectedPhase = maxPhase + Integer.MIN_VALUE; 508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(expectedPhase, phaser.getPhase()); 518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(parties, phaser.getRegisteredParties()); 528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(expectedPhase, phaser.register()); 538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(expectedPhase, phaser.arrive()); 548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(expectedPhase, phaser.arriveAndDeregister()); 558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void assertTerminated(Phaser phaser, int maxPhase) { 588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(phaser, maxPhase, 0); 598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Empty constructor builds a new Phaser with no parent, no registered 638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * parties and initial phase number of 0 648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructorDefaultValues() { 668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(); 678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(phaser.getParent()); 688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.getRegisteredParties()); 698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.getArrivedParties()); 708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.getUnarrivedParties()); 718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.getPhase()); 728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Constructing with a negative number of parties throws 768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * IllegalArgumentException 778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructorNegativeParties() { 798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new Phaser(-1); 818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Constructing with a negative number of parties throws 878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * IllegalArgumentException 888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructorNegativeParties2() { 908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new Phaser(new Phaser(), -1); 928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Constructing with a number of parties > 65535 throws 988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * IllegalArgumentException 998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructorPartiesExceedsLimit() { 1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new Phaser(maxParties); 1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new Phaser(maxParties + 1); 1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new Phaser(new Phaser(), maxParties); 1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new Phaser(new Phaser(), maxParties + 1); 1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * The parent provided to the constructor should be returned from 1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * a later call to getParent 1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor3() { 1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser parent = new Phaser(); 1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(parent, new Phaser(parent).getParent()); 1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(new Phaser(null).getParent()); 1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * The parent being input into the parameter should equal the original 1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * parent when being returned 1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor5() { 1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser parent = new Phaser(); 1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(parent, new Phaser(parent, 0).getParent()); 1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(new Phaser(null, 0).getParent()); 1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * register() will increment the number of unarrived parties by 1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * one and not affect its arrived parties 1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRegister1() { 1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(); 1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 0, 0); 1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 1, 1); 1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Registering more than 65536 parties causes IllegalStateException 1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRegister2() { 1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(0); 1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 0, 0); 1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.bulkRegister(maxParties - 10)); 1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, maxParties - 10, maxParties - 10); 1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 10; i++) { 1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, maxParties - 10 + i, maxParties - 10 + i); 1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, maxParties, maxParties); 1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.register(); 1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalStateException success) {} 1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.bulkRegister(Integer.MAX_VALUE); 1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalStateException success) {} 1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.bulkRegister(0)); 1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, maxParties, maxParties); 1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * register() correctly returns the current barrier phase number 1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * when invoked 1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRegister3() { 1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(); 1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.register()); 1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 1, 2, 2); 1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * register causes the next arrive to not increment the phase 1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * rather retain the phase number 1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRegister4() { 1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(1); 1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.register()); 1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.arrive()); 1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 1, 2, 1); 1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * register on a subphaser that is currently empty succeeds, even 1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * in the presence of another non-empty subphaser 1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRegisterEmptySubPhaser() { 2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser root = new Phaser(); 2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser child1 = new Phaser(root, 1); 2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser child2 = new Phaser(root, 0); 2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child2.register()); 2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(root, 0, 2, 2); 2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child1, 0, 1, 1); 2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child2, 0, 1, 1); 2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child2.arriveAndDeregister()); 2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(root, 0, 1, 1); 2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child1, 0, 1, 1); 2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child2, 0, 0, 0); 2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child2.register()); 2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child2.arriveAndDeregister()); 2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(root, 0, 1, 1); 2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child1, 0, 1, 1); 2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child2, 0, 0, 0); 2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child1.arriveAndDeregister()); 2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(root, 1); 2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(child1, 1); 2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(child2, 1); 2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Invoking bulkRegister with a negative parameter throws an 2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * IllegalArgumentException 2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBulkRegister1() { 2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new Phaser().bulkRegister(-1); 2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * bulkRegister should correctly record the number of unarrived 2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * parties with the number of parties being registered 2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBulkRegister2() { 2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(); 2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.bulkRegister(0)); 2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 0, 0); 2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.bulkRegister(20)); 2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 20, 20); 2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Registering with a number of parties greater than or equal to 1<<16 2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * throws IllegalStateException. 2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBulkRegister3() { 2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, new Phaser().bulkRegister((1 << 16) - 1)); 2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new Phaser().bulkRegister(1 << 16); 2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalStateException success) {} 2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new Phaser(2).bulkRegister((1 << 16) - 2); 2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalStateException success) {} 2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * the phase number increments correctly when tripping the barrier 2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPhaseIncrement1() { 2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int size = 1; size < nine; size++) { 2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(size); 2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int index = 0; index <= (1 << size); index++) { 2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int phase = phaser.arrive(); 2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(index % size == 0 ? (index / size) == phase : index - (phase * size) > 0); 2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arrive() on a registered phaser increments phase. 2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArrive1() { 2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(1); 2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 1, 1); 2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 1, 1, 1); 2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndDeregister does not wait for others to arrive at barrier 2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndDeregister() { 2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(1); 2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 10; i++) { 2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 1, 1); 2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 2, 2); 2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arriveAndDeregister()); 2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 1, 1); 2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arriveAndDeregister()); 3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(phaser, 1); 3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndDeregister does not wait for others to arrive at barrier 3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArrive2() { 3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(); 3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Thread> threads = new ArrayList<Thread>(); 3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 10; i++) { 3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threads.add(newStartedThread(new CheckedRunnable() { 3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arriveAndDeregister()); 3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }})); 3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Thread thread : threads) 3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(thread); 3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 1, 1); 3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 1, 1, 1); 3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arrive() returns a negative number if the Phaser is terminated 3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArrive3() { 3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(1); 3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.forceTermination(); 3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(phaser, 0, 1); 3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.getPhase() + Integer.MIN_VALUE); 3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.arrive() < 0); 3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.register() < 0); 3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.arriveAndDeregister() < 0); 3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.awaitAdvance(1) < 0); 3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.getPhase() < 0); 3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndDeregister() throws IllegalStateException if number of 3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * registered or unarrived parties would become negative 3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndDeregister1() { 3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(); 3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.arriveAndDeregister(); 3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalStateException success) {} 3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndDeregister reduces the number of arrived parties 3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndDeregister2() { 3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(1); 3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 2, 1); 3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arriveAndDeregister()); 3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 1, 1, 1); 3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndDeregister arrives at the barrier on a phaser with a parent and 3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * when a deregistration occurs and causes the phaser to have zero parties 3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * its parent will be deregistered as well 3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndDeregister3() { 3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser parent = new Phaser(); 3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser child = new Phaser(parent); 3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child, 0, 0, 0); 3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(parent, 0, 0, 0); 3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child.register()); 3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child, 0, 1, 1); 3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(parent, 0, 1, 1); 3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child.arriveAndDeregister()); 3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(child, 1); 3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(parent, 1); 3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndDeregister deregisters one party from its parent when 3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * the number of parties of child is zero after deregistration 3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndDeregister4() { 3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser parent = new Phaser(); 3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser child = new Phaser(parent); 3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, parent.register()); 3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child.register()); 3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child, 0, 1, 1); 3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(parent, 0, 2, 2); 3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child.arriveAndDeregister()); 3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child, 0, 0, 0); 3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(parent, 0, 1, 1); 3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndDeregister deregisters one party from its parent when 4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * the number of parties of root is nonzero after deregistration. 4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndDeregister5() { 4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser root = new Phaser(); 4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser parent = new Phaser(root); 4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser child = new Phaser(parent); 4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(root, 0, 0, 0); 4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(parent, 0, 0, 0); 4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child, 0, 0, 0); 4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child.register()); 4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(root, 0, 1, 1); 4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(parent, 0, 1, 1); 4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(child, 0, 1, 1); 4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child.arriveAndDeregister()); 4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(child, 1); 4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(parent, 1); 4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(root, 1); 4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndDeregister returns the phase in which it leaves the 4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * phaser in after deregistration 4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndDeregister6() { 4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(2); 4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.arriveAndAwaitAdvance()); 4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 1, 2, 2); 4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.arriveAndDeregister()); 4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 1, 1, 1); 4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.arriveAndDeregister()); 4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTerminated(phaser, 2); 4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * awaitAdvance succeeds upon advance 4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwaitAdvance1() { 4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(1); 4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.awaitAdvance(0)); 4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * awaitAdvance with a negative parameter will return without affecting the 4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * phaser 4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwaitAdvance2() { 4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(); 4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.awaitAdvance(-1) < 0); 4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 0, 0); 4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * awaitAdvanceInterruptibly blocks interruptibly 4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwaitAdvanceInterruptibly_interruptible() throws InterruptedException { 4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(1); 4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(2); 4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = newStartedThread(new CheckedRunnable() { 4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.awaitAdvanceInterruptibly(0); 4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.awaitAdvanceInterruptibly(0); 4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = newStartedThread(new CheckedRunnable() { 4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws TimeoutException { 4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.awaitAdvanceInterruptibly(0, 2*LONG_DELAY_MS, MILLISECONDS); 4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.awaitAdvanceInterruptibly(0, 2*LONG_DELAY_MS, MILLISECONDS); 4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 1, 1); 5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadsStayAlive(t1, t2); 5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t1.interrupt(); 5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t2.interrupt(); 5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, 1, 1); 5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 1, 1, 1); 5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * awaitAdvance continues waiting if interrupted before waiting 5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwaitAdvanceAfterInterrupt() { 5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(); 5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseArrive = new CountDownLatch(1); 5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseArrive.countDown(); 5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Thread.currentThread().isInterrupted()); 5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.awaitAdvance(0)); 5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Thread.interrupted()); 5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseArrive); 5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle waitForThreadToEnterWaitState(t, SHORT_DELAY_MS); 5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.awaitAdvance(0)); 5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Thread.interrupted()); 5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * awaitAdvance continues waiting if interrupted while waiting 5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwaitAdvanceBeforeInterrupt() { 5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(); 5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseArrive = new CountDownLatch(1); 5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.currentThread().isInterrupted()); 5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseArrive.countDown(); 5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.awaitAdvance(0)); 5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Thread.interrupted()); 5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseArrive); 5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle waitForThreadToEnterWaitState(t, SHORT_DELAY_MS); 5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.awaitAdvance(0)); 5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Thread.interrupted()); 5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndAwaitAdvance continues waiting if interrupted before waiting 5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndAwaitAdvanceAfterInterrupt() { 5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(); 5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Thread.currentThread().isInterrupted()); 5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.arriveAndAwaitAdvance()); 5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Thread.currentThread().isInterrupted()); 5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle waitForThreadToEnterWaitState(t, SHORT_DELAY_MS); 5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.arriveAndAwaitAdvance()); 5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Thread.interrupted()); 5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndAwaitAdvance continues waiting if interrupted while waiting 5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndAwaitAdvanceBeforeInterrupt() { 5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(); 5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.currentThread().isInterrupted()); 6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.arriveAndAwaitAdvance()); 6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Thread.currentThread().isInterrupted()); 6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle waitForThreadToEnterWaitState(t, SHORT_DELAY_MS); 6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.arriveAndAwaitAdvance()); 6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Thread.interrupted()); 6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * awaitAdvance atomically waits for all parties within the same phase to 6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * complete before continuing 6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwaitAdvance4() { 6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(4); 6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final AtomicInteger count = new AtomicInteger(0); 6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Thread> threads = new ArrayList<Thread>(); 6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 4; i++) 6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threads.add(newStartedThread(new CheckedRunnable() { 6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int k = 0; k < 3; k++) { 6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2*k+1, phaser.arriveAndAwaitAdvance()); 6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle count.incrementAndGet(); 6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2*k+1, phaser.arrive()); 6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2*k+2, phaser.awaitAdvance(2*k+1)); 6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(4*(k+1), count.get()); 6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}})); 6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Thread thread : threads) 6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(thread); 6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * awaitAdvance returns the current phase 6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwaitAdvance5() { 6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(1); 6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.awaitAdvance(phaser.arrive())); 6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.getPhase()); 6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.register()); 6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Thread> threads = new ArrayList<Thread>(); 6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 8; i++) { 6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch latch = new CountDownLatch(1); 6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final boolean goesFirst = ((i & 1) == 0); 6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threads.add(newStartedThread(new CheckedRunnable() { 6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (goesFirst) 6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle latch.countDown(); 6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle else 6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(latch); 6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.arrive(); 6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }})); 6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (goesFirst) 6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(latch); 6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle else 6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle latch.countDown(); 6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i + 2, phaser.awaitAdvance(phaser.arrive())); 6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i + 2, phaser.getPhase()); 6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Thread thread : threads) 6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(thread); 6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * awaitAdvance returns the current phase in child phasers 6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwaitAdvanceTieredPhaser() throws Exception { 6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser parent = new Phaser(); 6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final List<Phaser> zeroPartyChildren = new ArrayList<Phaser>(3); 6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final List<Phaser> onePartyChildren = new ArrayList<Phaser>(3); 6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 3; i++) { 6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle zeroPartyChildren.add(new Phaser(parent, 0)); 6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle onePartyChildren.add(new Phaser(parent, 1)); 6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final List<Phaser> phasers = new ArrayList<Phaser>(); 6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phasers.addAll(zeroPartyChildren); 6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phasers.addAll(onePartyChildren); 6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phasers.add(parent); 6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Phaser phaser : phasers) { 6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(-42, phaser.awaitAdvance(-42)); 6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42)); 6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42, SMALL_DELAY_MS, MILLISECONDS)); 6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Phaser child : onePartyChildren) 6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, child.arrive()); 6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Phaser phaser : phasers) { 6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(-42, phaser.awaitAdvance(-42)); 6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42)); 7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42, SMALL_DELAY_MS, MILLISECONDS)); 7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.awaitAdvance(0)); 7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.awaitAdvanceInterruptibly(0)); 7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.awaitAdvanceInterruptibly(0, SMALL_DELAY_MS, MILLISECONDS)); 7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Phaser child : onePartyChildren) 7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, child.arrive()); 7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Phaser phaser : phasers) { 7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(-42, phaser.awaitAdvance(-42)); 7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42)); 7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42, SMALL_DELAY_MS, MILLISECONDS)); 7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, phaser.awaitAdvance(0)); 7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, phaser.awaitAdvanceInterruptibly(0)); 7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, phaser.awaitAdvanceInterruptibly(0, SMALL_DELAY_MS, MILLISECONDS)); 7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, phaser.awaitAdvance(1)); 7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, phaser.awaitAdvanceInterruptibly(1)); 7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, phaser.awaitAdvanceInterruptibly(1, SMALL_DELAY_MS, MILLISECONDS)); 7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * awaitAdvance returns when the phaser is externally terminated 7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwaitAdvance6() { 7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(3); 7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseForceTermination = new CountDownLatch(2); 7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final List<Thread> threads = new ArrayList<Thread>(); 7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 2; i++) { 7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Runnable r = new CheckedRunnable() { 7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.arrive()); 7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseForceTermination.countDown(); 7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.awaitAdvance(0) < 0); 7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.isTerminated()); 7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.getPhase() < 0); 7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.getPhase() + Integer.MIN_VALUE); 7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(3, phaser.getRegisteredParties()); 7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threads.add(newStartedThread(r)); 7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseForceTermination); 7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.forceTermination(); 7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(phaser.isTerminated()); 7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.getPhase() + Integer.MIN_VALUE); 7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Thread thread : threads) 7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(thread); 7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(3, phaser.getRegisteredParties()); 7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndAwaitAdvance throws IllegalStateException with no 7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * unarrived parties 7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndAwaitAdvance1() { 7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Phaser phaser = new Phaser(); 7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.arriveAndAwaitAdvance(); 7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalStateException success) {} 7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * arriveAndAwaitAdvance waits for all threads to arrive, the 7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * number of arrived parties is the same number that is accounted 7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * for when the main thread awaitsAdvance 7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testArriveAndAwaitAdvance3() { 7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Phaser phaser = new Phaser(1); 7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final int THREADS = 3; 7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseArrive = new CountDownLatch(THREADS); 7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final List<Thread> threads = new ArrayList<Thread>(); 7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < THREADS; i++) 7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threads.add(newStartedThread(new CheckedRunnable() { 7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, phaser.register()); 7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseArrive.countDown(); 7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, phaser.arriveAndAwaitAdvance()); 7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }})); 7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseArrive); 7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (phaser.getArrivedParties() < THREADS) 7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(THREADS, phaser.getArrivedParties()); 7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Thread thread : threads) 7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle waitForThreadToEnterWaitState(thread, SHORT_DELAY_MS); 7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Thread thread : threads) 7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(thread.isAlive()); 7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 0, THREADS + 1, 1); 7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle phaser.arriveAndAwaitAdvance(); 7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Thread thread : threads) 7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(thread); 7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertState(phaser, 1, THREADS + 1, THREADS + 1); 7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 798