monitor casino
{
bool playing, exEquo;
int max, n, leaving, waiting;
condition wantToPlay, player;
playing = exEquo = false;
n = waiting = 0;
void misiedo()
{
if (playing)
{
waiting++;
wantToPlay.wait();
waiting--;
}
if (++n < 5)
player.wait();
else
{
playing = true;
max = 0;
}
player.signal();
}
int gioca(int number)
{
if (number == max)
exEquo = true;
else if (number > max)
{
exEquo = false;
max = number;
}
if (--n > 0)
player.wait();
else
leaving = 5;
player.signal();
return (!exEquo && number == max)? 4 : -1;
}
void mialzo()
{
if (--leaving == 0)
{
while (waiting > 0 && n < 4)
wantToPlay.signal();
if (waiting > 0)
wantToPlay.signal();
else
playing = false
}
}
}
def ssend2(m, d1, d2):
msg = ( SND, getpid(), d1, d2, m )
asend(msg, server)
return arecv(server)
def sreceive():
msg = ( RCV, getpid(), None, None, None )
asend(msg, server)
return arecv(server)
def server():
while True:
flag, src, d1, d2, msg = arecv(*)
if flag == RCV:
msg, sender, _, _ = dbSnd.retrieve(query = '(?, ?, src, ?) or (?, ?, ?, src)')
if msg:
asend(msg, src)
asend(src, sender)
else:
dbRcv.insert(src)
else:
if dbRcv.retrieve(d1):
asend(msg, d1)
asend(d1, src)
elif dbRcv.retrieve(d2):
asend(msg, d2)
asend(d2, src)
else:
dbSnd.insert((msg, src, d1, d2))