/*
 * Script 3.6.2 Exercise 6
 *
 * implement barrier
 *
 */
/* output:

    java ex6 2000
    
    w = 15
    w = 8
    w = 19
    w = 17
    w = 27
    w = 24
    w = 5
    w = 28
    w = 3
    w = 4
    w = 9
    w = 13
    w = 29
    w = 21
    w = 10
    w = 20
    w = 12
    w = 18
    w = 26
    w = 0
    w = 1
    w = 11
    w = 22
    w = 6
             g = 6
             g = 15
             g = 27
             g = 24
             g = 3
             g = 9
             g = 21
             g = 12
             g = 18
             g = 0
    w = 25
    w = 14
    w = 23
    w = 16
    w = 2
             g = 2
             g = 8
             g = 17
             g = 5
             g = 29
             g = 20
             g = 26
             g = 11
             g = 14
             g = 23
    w = 7
             g = 7
             g = 19
             g = 28
             g = 4
             g = 13
             g = 10
             g = 1
             g = 22
             g = 25
             g = 16
    termination
*/

class ex6act1 implements Runnable {

  int l;

  public ex6act1(int li) {
    l = li; 
  }

  public void run() {

    ex6.probe();

    System.out.println("w = " + l);

    /* wait for others */
    ex6.bar[l % ex6.b].check();

    System.out.println("         g = " + l);

    ex6.probe();
  
  }
}


public class ex6 {
  
  /*parameters */
  public static final int t = 30, b = 3;

  /* barrier */
  public static barrier bar[];

  public static int p = 100; 
 
  public static void main(String[] args) throws InterruptedException {

    if (args.length == 1) { 
       try { p = Integer.parseInt(args[0]); } 
       catch (NumberFormatException e) { } 
    } 

    /* init barrier */
    bar = new barrier[b];
    for (int i = 0; i<b; i++ ) { bar[i] = new barrier(t/b); }

    /* con statement */
    Thread th[] = new Thread[t]; 
    for (int i = 0; i<t; i++) { 
        th[i] = new Thread(new ex6act1(i));
        th[i].start();
    }
    System.out.println();
    for (int i = 0; i<t; i++) { th[i].join(); }

    System.out.println("termination");

  }
 
  public static void probe() { 
    Sleep.sleep(p);
  }

}




