(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