home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 349_01 / sss.arc / EX_0604.C < prev    next >
Text File  |  1991-04-10  |  2KB  |  102 lines

  1. /* Program EX_0604.C
  2.    Listing 13C - see documentation in TUTOR.SSS
  3. */
  4.  
  5. #include "SSSC.H"
  6.  
  7. #define  ARRIVL  1
  8. #define  STARTA  2
  9. #define  ENDACT  3
  10. #define  NEXTAC  4
  11.  
  12. #define  ORDNRY  0.0
  13. #define  DELUX   1.0
  14.  
  15. int i, id, server, ecode;
  16.  
  17. void prime()
  18. {
  19.   server = 2;
  20.   id = 0;
  21.   INIQUE(2, 3, 1);
  22.   INISTA(1, "Interrupts", 0, 0, 0, 0);
  23.   SIMEND(60.0);
  24.   CREATE(0.0, 0);
  25. }
  26.  
  27. void preemp()
  28. {
  29.   int i; double remt;
  30.   QUEUE(2, 0);
  31.   i = 1;
  32.   while ((i <= NC()) &&
  33.    ((AIC(i, 3) == DELUX) || (NEIC(i) != ENDACT)))
  34.            i++;
  35.  
  36.   if (i <= NC())
  37.   {
  38.     remt = TIC(i) - T();
  39.     REMVFC(i);
  40.     SETA(1, A(1) + 1.0);
  41.     SETA(2, remt);
  42.     SETQDC(1, "LIFO");
  43.     QUEUE(1, 0.0);
  44.     SETQDC(1, "FIFO");
  45.     REMVFQ(2, 1);
  46.     SCHED(0, STARTA, IDE());
  47.   }
  48. }
  49.  
  50. main()
  51. {
  52.   prime();
  53.  
  54.   do
  55.   {
  56.     if ((ecode = NEXTEV()) > 0)
  57.     switch(ecode)
  58.     {
  59.  
  60.     case ARRIVL:
  61.               id++;
  62.               CREATE(EX(2.0), id);
  63.               SETA(1, 0.0);
  64.               SETA(2, TR(1.0, 2.0, 3.0));
  65.               if (RA() < 0.25) SETA(3, DELUX );
  66.               else             SETA(3, ORDNRY);
  67.               SCHED(0.0, NEXTAC, IDE());
  68.               break;
  69.  
  70.     case NEXTAC:
  71.               if (server) SCHED(0.0, STARTA, IDE());
  72.               else if (A(3) == DELUX) preemp();
  73.               else QUEUE(1, 0.0);
  74.               break;
  75.  
  76.     case STARTA:
  77.               SCHED(A(2), ENDACT, IDE());
  78.               server--;
  79.               break;
  80.  
  81.     case ENDACT:
  82.               if (A(3) != DELUX) TALLY(1, A(1));
  83.               DISPOS();
  84.               server++;
  85.               if (NQ(2))
  86.               {
  87.                 REMVFQ(2, 1);
  88.                 SCHED(0.0, STARTA, IDE());
  89.               }
  90.  
  91.               else if (NQ(1))
  92.               {
  93.                 REMVFQ(1, 1);
  94.                 SCHED(0.0, STARTA, IDE());
  95.               }
  96.               break;
  97.     }
  98.   } while (ecode);
  99.  
  100.   SUMRY("");
  101. }
  102.