SOURCE FILE:  sem.h 
/* 
      Files sem.h and sem.cpp implement a kind of counting
      semaphore that duplicates exactly the semantics of the
      counting semaphores of the Silberschatz-Galvin operating
      systems text book.  Also, signal operations on these
      semaphores free blocked threads in FIFO order.
*/
/* Simulated Process Control Block to represent 
   processes waiting on a semaphore. */
typedef struct sim_PCB
  {
    int               id_num ;  /* Unique id of thread. */
    int               in_Q ;     /* mark if in Q */
    struct sim_PCB    *next ;  /* For linked list of sim_PCB's in
                                  sim_semaphore. */
  } sim_PCB ;
/* Data space for simulated semaphore object. */
typedef struct sim_sem_data
  {
    /* mutex_t	      lock ; */    /* Built-in cthread devices */
    /* condition_t    cond ;	*/   /* for synchronization.     */
    pthread_mutex_t   lock ;	/* Built-in pthread devices */
    pthread_cond_t    cond ;	/* for synchronization.     */
    int		      value ;	/* Semaphore "counter" or "value". */
    sim_PCB	      *Qfront;
    sim_PCB           *Qrear ;
  } sim_sem_data ;
/* Simulated seamphore object */
typedef sim_sem_data *sim_semaphore ;
/* Function that creates and returns a new semaphore.  The
   counter of the semaphore is initialized to the value of the
   parameter init_val. */
sim_semaphore create_sim_sem(int  init_val) ;
/* The wait operation on the simulated semaphore. */
void wait_sem (sim_semaphore sem ) ;
/* The signal operation on the simulated semaphore. */
void signal_sem (sim_semaphore sem) ;