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) |
|
|