home *** CD-ROM | disk | FTP | other *** search
- /* Program EX_0604.C
- Listing 13C - see documentation in TUTOR.SSS
- */
-
- #include "SSSC.H"
-
- #define ARRIVL 1
- #define STARTA 2
- #define ENDACT 3
- #define NEXTAC 4
-
- #define ORDNRY 0.0
- #define DELUX 1.0
-
- int i, id, server, ecode;
-
- void prime()
- {
- server = 2;
- id = 0;
- INIQUE(2, 3, 1);
- INISTA(1, "Interrupts", 0, 0, 0, 0);
- SIMEND(60.0);
- CREATE(0.0, 0);
- }
-
- void preemp()
- {
- int i; double remt;
- QUEUE(2, 0);
- i = 1;
- while ((i <= NC()) &&
- ((AIC(i, 3) == DELUX) || (NEIC(i) != ENDACT)))
- i++;
-
- if (i <= NC())
- {
- remt = TIC(i) - T();
- REMVFC(i);
- SETA(1, A(1) + 1.0);
- SETA(2, remt);
- SETQDC(1, "LIFO");
- QUEUE(1, 0.0);
- SETQDC(1, "FIFO");
- REMVFQ(2, 1);
- SCHED(0, STARTA, IDE());
- }
- }
-
- main()
- {
- prime();
-
- do
- {
- if ((ecode = NEXTEV()) > 0)
- switch(ecode)
- {
-
- case ARRIVL:
- id++;
- CREATE(EX(2.0), id);
- SETA(1, 0.0);
- SETA(2, TR(1.0, 2.0, 3.0));
- if (RA() < 0.25) SETA(3, DELUX );
- else SETA(3, ORDNRY);
- SCHED(0.0, NEXTAC, IDE());
- break;
-
- case NEXTAC:
- if (server) SCHED(0.0, STARTA, IDE());
- else if (A(3) == DELUX) preemp();
- else QUEUE(1, 0.0);
- break;
-
- case STARTA:
- SCHED(A(2), ENDACT, IDE());
- server--;
- break;
-
- case ENDACT:
- if (A(3) != DELUX) TALLY(1, A(1));
- DISPOS();
- server++;
- if (NQ(2))
- {
- REMVFQ(2, 1);
- SCHED(0.0, STARTA, IDE());
- }
-
- else if (NQ(1))
- {
- REMVFQ(1, 1);
- SCHED(0.0, STARTA, IDE());
- }
- break;
- }
- } while (ecode);
-
- SUMRY("");
- }