|  
 
  |  
 
  |  
 
  |  
   typedef struct PCB
   {
      char   Name[12];         /* Name to id Prosim Entity (for debugging) */         
      long   *Param;           /* Parameter  */
      int    State;            /* State of the process 
                                  can be: (PASSIVE, WAITING or ACTIVE) */
      struct QElem *Queue;     /* Queue of this Prosim entity */     
      double ArrivalTime;      /* Time of arrival */
      double EventTime;        /* Next event time */
      long Mem[MAXWSSIZE];     /* Stack space for process */
      .....
   } PCBType;
 |  
Notes:
 
  |  
    void InitProsim(unsigned int MaxNProcess, unsigned int MaxNQElems,      
                    unsigned int MaxNTimeHeap);
 |  
 
  |  
     InitProsim( 1000, 1000, 1000 );         
 |  
    PCBType * Generate(char *name, void (*ProcName)(), void *param);
 |  
 
  |  
   /* --------------------------------------------------
      Function that is executed by a Prosim co-routine
      -------------------------------------------------- */          
   void Proc1()
   {
       while (1)
       {
   	  Hold(1.2); 
   	  printf("Proc1: Now = %lf\n", Now);
       }
   }
   int main(int argc, char **argv)
   {
      ....
      Generate("Name:Proc1", Proc1, 0);
      ....
   }
 |  
    void Terminate();         
 |  
 
  |  
     Terminate( );         
 |  
    void Hold(double time);         
 |  
 
  |  
     double serviceTime = ....;
     Hold( serviceTime );   // Sim. serving a client for given service time !        
 |  
    void Passivate(0, 0);       
 |  
 
  |  
     Passivate( 0,0 );         
 |  
    void ReActivate(PCBType *PCBPtr, 0, 0);
   
 |  
 
  |  
     PCBType * client;
     ....
     Dequeue(HEAD, &client, 0, 0, 0);    // Get next client from head of queue    
     Hold( serviceTime );                // Serve client 
     ReActivate( client, 0, 0 );         // Resume client (so it can do calculations...)     
 |  
    void Enqueue(int pos, PCBType *ServerPCBPtr, 0, 0, 0);    
    
 |  
 
  |  
   PCBType *Server;
   void Client()
   {
      ....
      Enqueue( HEAD, Server, 0, 0, 0 );   /* Enter server's queue */
      ReActivate(Server, 0, 0);           /* ReActivate the server */
      Passivate(0, 0);                    /* Wait until server finishes     
				             serving me */
    }
 |  
    void Dnqueue(int pos, PCBType **ClientPCBPtr, 0, 0, 0);    
    
 |  
 
  |  
   void Server()
   {
      PCBType *Client;
      ....
      while (1)
      {
         if ( my queue is empty )
	 {
	    Passivate(0, 0);
	 }
         /* ----------------------------------------------
	    There is a client in my queue
	    (Server MAY have been ReActivated by a client)
	    ---------------------------------------------- */
         Dequeue( HEAD, &Client, 0, 0, 0 );   /* Enter server's queue */
	 Hold(serviceTime);	              /* Provide service to client */     
         ReActivate(Server, 0, 0);            /* ReActivate the server */
    }
 |  
 
 |  
   /* -------------------------------------------------------
      Client generator process
      ------------------------------------------------------- */
   void GeneratorProc()
   {
      while(1)
       {
   	 Hold( ARRIVAL_DELAY );              // Wait Inter-arrval time
   	 Generate("Cli", ClientProc, 0);     // Create a client process...
	         // The client process will do furthero processing for itself     
       }
   }
 |  
   /* -------------------------------------------------------
      Client()
      ------------------------------------------------------- */
   void ClientProc()
   {
      /* ----------------------
         Enter server's queue
	 ---------------------- */
      Enqueue(TAIL, Server, 0, 0, 0);
      /* ----------------------
         ReActivate the server (it may be Passivated due to empty queue)    
	 ---------------------- */
      ReActivate(Server, 0, 0);
      /* ------------------------------------------
         Wait for server to complete serving me...
	 ------------------------------------------ */
      Passivate(0, 0);
      /* ---------------------------------------
         Print delay experienced by the client
	 --------------------------------------- */
      printf("Now = %lf: Client is done... my delay = %lf\n",
   	      GetSimTime(),
   	      GetSimTime() - GetMyArrivalTime() );
      /* ------------------------------------------
         De-allocate Prosim resources (PCB)
	 ------------------------------------------ */
      Terminate();
   }
 |  
   /* -------------------------------------------------------
      Server()
      ------------------------------------------------------- */
   void ServerProc()
   {
      PCBType *Client;
    
      while (1)
      {
   	 if (MyQLength() == 0)
   	 {  
	    Passivate(0, 0);        // Wait for a client to arrive       
   	 }
	 /* -----------------------------------------------------
	    We execution reaches/resumes here, we know there is
	    a client in the server's queue !
	    ----------------------------------------------------- */
   	 Dequeue(HEAD, &Client, NULL, NULL, NULL);      // Get client at head of queue     
   	 Hold( SERVICE_DELAY );		 // "Service" the client (it only takes time :-))
    
   	 ReActivate(Client, 0, 0);       // Make client resume (further processing)...
      }
   }
 |  
   int main(int argc, char **argv)
   {
      double SimLength;
    
      ....
   
      /* -----------------------------------------
   	 Allocate space for 1000 Prosim processes
   	 ----------------------------------------- */
      InitProsim(1000, 1000, 1000);
    
   
      /* -----------------------------------------
   	 Create the "client generator" process (now you have 999 PCB's left)     
   	 ----------------------------------------- */
      Generator = Generate("Gen", GeneratorProc, 0);
   
      /* -----------------------------------------
   	 Create one "server" process (now you have 998 PCB's left)
   	 ----------------------------------------- */
      Server = Generate("Serv", ServerProc, 0);
   
      /* ----------------------------------------------
   	 Run simulation for "SimLength" virtual seconds
   	 ---------------------------------------------- */
      StartSimulate(SimLength);
    
      printf("Done.\n");
   }
 |  
        
  
Compile with:
   cc -g -O -o main2 -I /home/cs558000/lib main2.c \
                     -L /home/cs558000/lib -lProSim4 -lOnAbort -lm     
 |  
     #include <stdlib.h>
     void srandom(unsigned int seed);     /* Set the seed for the RN generator */     
     long random();                       /* Get a random number between (0 .. 2^31-1) */
 |  
long I_Uniform(int a, int b, int stream); /* Integer Unif[a..b] */ double D_Uniform(double a, double b, int stream); /* Unif[a..b] */  |  
Note:
 
  |  
 
  |  
The exponential distributed number generator in Prosim:
    double RateExponential(double lambda, int stream);   /* Exponential dist with rate */      
 |  
   /* -------------------------------------------------------
      Client generator process
      ------------------------------------------------------- */
   void GeneratorProc()
   {
      while(1)
       {
         /* --------------------------------
	    Wait an expon. dist. random time
	    -------------------------------- */
   	 Hold( RateExponential(ARRIVALRATE, 0) );    // ***** Inter-arrval time is expon. distr. !!!    
   	 Generate("Cli", ClientProc, 0);     // Create a client process...
	         // The client process will do further processing for itself     
       }
   }
 |  
   /* -------------------------------------------------------
      Client()
      ------------------------------------------------------- */
   void ClientProc()
   {
      /* ----------------------
         Enter server's queue
	 ---------------------- */
      Enqueue(TAIL, Server, 0, 0, 0);
      /* ----------------------
         ReActivate the server (it may be Passivated due to empty queue)    
	 ---------------------- */
      ReActivate(Server, 0, 0);
      /* ------------------------------------------
         Wait for server to complete serving me...
	 ------------------------------------------ */
      Passivate(0, 0);
      /* ---------------------------------------
         Print delay experienced by the client
	 --------------------------------------- */
      printf("Now = %lf: Client is done... my delay = %lf\n",
   	      GetSimTime(),
   	      GetSimTime() - GetMyArrivalTime() );
      /* ------------------------------------------
         De-allocate Prosim resources (PCB)
	 ------------------------------------------ */
      Terminate();
   }
 |  
   /* -------------------------------------------------------
      Server()
      ------------------------------------------------------- */
   void ServerProc()
   {
      PCBType *Client;
    
      while (1)
      {
   	 if (MyQLength() == 0)
   	 {  
	    Passivate(0, 0);        // Wait for a client to arrive       
   	 }
	 /* -----------------------------------------------------
	    We execution reaches/resumes here, we know there is
	    a client in the server's queue !
	    ----------------------------------------------------- */
   	 Dequeue(HEAD, &Client, NULL, NULL, NULL);      // Get client at head of queue     
   	 Hold( RateExponential(SERVICERATE, 1) );     // ***** Expon. distr. departure rate !    
    
   	 ReActivate(Client, 0, 0);       // Make client resume (further processing)...
      }
   }
 |  
   int main(int argc, char **argv)
   {
      double SimLength;
    
      ....
   
      /* -----------------------------------------
   	 Allocate space for 1000 Prosim processes
   	 ----------------------------------------- */
      InitProsim(1000, 1000, 1000);
    
   
      /* -----------------------------------------
   	 Create the "client generator" process (now you have 999 PCB's left)     
   	 ----------------------------------------- */
      Generator = Generate("Gen", GeneratorProc, 0);
   
      /* -----------------------------------------
   	 Create one "server" process (now you have 998 PCB's left)
   	 ----------------------------------------- */
      Server = Generate("Serv", ServerProc, 0);
   
      /* ----------------------------------------------
   	 Run simulation for "SimLength" virtual seconds
   	 ---------------------------------------------- */
      StartSimulate(SimLength);
    
      printf("Done.\n");
   }
 |  
        
  
Compile with:
   cc -g -O -o main3 -I /home/cs558000/lib main3.c \
                     -L /home/cs558000/lib -lProSim4 -lOnAbort -lm     
 |