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 >
Wrap
Text File
|
1991-04-10
|
2KB
|
102 lines
/* 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("");
}