(Latest Revision: Mon Oct 2 22:08:37 PDT 2000 )
global shared var waiting : array [0 .. n-1] of boolean ;
lock : boolean ;
The code for process #me is:
local var j : 0 .. n-1 ;
testShowsThingIsStillLocked : boolean ;
repeat
waiting[me] := true ;
testShowsThingIsStillLocked := true ;
while waiting[me] and testShowsThingIsStillLocked
do testShowsThingIsStillLocked := Test-and-Set(lock) ;
waiting[me] := false ;
.. CS(me) ..
j := (me + 1) mod n ;
while (j <> me) and (not waiting[j])
do j := (j + 1) mod n ;
if j = me
then lock := false
else waiting[j] := false ;
.. RS(me) ..
until false