/* 			     Unit Resource Class
*/

/* 			      Requires process.h
*/


/*	      binary semaphore with p = "request", v = "release"
*/

import sim.*;
import queues.*;

class resource {

    String	name;
    boolean	busy;
    Queue	q;

    resource(String n)
    {
	name = n;
  	busy = false;
  	q = new Queue();
    } 

    /* debug print function */
    void print() {
      System.out.println("Resource " + name + " (busy=" + busy + ")");
      q.Print();
    }

    /* request this resource; block if necessary */
    void request() {
      if (busy)
	scheduler.current.waitq(q);
      else
	busy = true;
    }

    /* release this resource */
    void release() {
      if (q.IsEmpty())
	busy = false;
      else
	scheduler.activate((process)q.Dequeue());
    }
}

