|
Server(server, client): |
|
var count := R, wait[.] :=
false |
|
loop |
|
var i := select(server) |
|
if receive(server[i]) = request then |
|
if count > 0 then |
|
send(client[i], grant) |
|
count := count-1 |
|
else |
|
wait[i] := true |
|
else // release received |
|
if exists j in [1,C]: wait[j] then |
|
take j in [1,C] such that wait[j] |
|
send(client[j], grant) |
|
wait[j] := false |
|
else |
|
count := count+1 |
|
end |
|
end
|
|
|
Server(server, client, count, wait) :<=> |
|
exists i in [1,C]: |
|
or |
|
receivei(server, request) /\ count >
0 /\ |
|
sendi(client, grant) /\ count' =
count-1 /\ |
|
changed(server, client, count) |
|
receivei(server, request) /\ count > 0 /\ |
|
wait' = wait[i |-> true] /\ |
|
changed(server, wait) |
|
receivei(server, release)
/\ exists j: (wait[j] /\ |
|
sendj(client, grant) /\ wait' = wait[j |-> true]) /\ |
|
changed(server,
client, wait) |
|
receivei(server, release) /\ exists j: wait[j] /\ |
|
count' = count+1 /\ |
|
changed(server, count) |
|
|
|