/*
			     Condition Variables
				  Using DSS

				    CS509
				 Winter 1995
				 G. Lindstrom

*/

import sim.*;
import queues.*;

class condition_var {

    String name;
    boolean verbose;
    Queue q;

condition_var(String n)
{
    this(n, false);
}

condition_var(String n, boolean v)
{
    name = n;
    verbose = v;
    q = new Queue();
}

void wait(resource m) 
{
  if ( verbose )
    System.out.print("Time " + scheduler.clock + ": " + 
		scheduler.current.name + " releases " + m.name + " mutex\n");
  m.release();

  if ( verbose )
    System.out.print("Time " + scheduler.clock + ": " + 
		scheduler.current.name + " waits for " + name + "\n");
  scheduler.current.waitq(q);

  if ( verbose )
    System.out.print("Time " + scheduler.clock + ": " + 
		scheduler.current.name + " requests " + m.name + " mutex\n");

  m.request();
  if ( verbose )
    System.out.print("Time " + scheduler.clock + ": " + 
		scheduler.current.name + " receives " + m.name + " mutex\n");
}

void signal() {
  if ( verbose )
    System.out.print("Time " + scheduler.clock + ": " + 
		scheduler.current.name + " signals " + name + "\n");
  if (!q.IsEmpty())
    scheduler.activate((process)q.Dequeue());
}

void broadcast() {
  if ( verbose )
    System.out.print("Time " + scheduler.clock + ": " + 
		scheduler.current.name + " broadcasts " + name + "\n");
  while (!q.IsEmpty())
    scheduler.activate((process)q.Dequeue());
}

}

