meth Trans(P ?R TS) Halt={NewName} T=trans(stamp:TS save:{NewDictionary} body:P state:{NewCell running} result:R) proc {ExcT C X Y} S1 S2 in {@tm getlock(T C S1)} if S1==halt then raise Halt end end {@tm savestate(T C S2)} {Wait S2} {Exchange C.state X Y} end proc {AccT C ?X} {ExcT C X X} end proc {AssT C X} {ExcT C _ X} end proc {AboT} {@tm abort(T)} R=abort raise Halt end end in thread try Res={T.body t(access:AccT assign:AssT exchange:ExcT abort:AboT)} in {@tm commit(T)} R=commit(Res) catch E then if E\=Halt then {@tm abort(T)} R=abort(E) end end end end meth getlock(T C ?Sync) if @(T.state)==probation then {self Unlockall(T true)} {self Trans(T.body T.result T.stamp)} Sync=halt elseif @(C.owner)==unit then (C.owner):=T Sync=ok elseif T.stamp==@(C.owner).stamp then Sync=ok else /* T.stamp\=@(C.owner).stamp */ T2=@(C.owner) in {C.queue.enqueue Sync#T T.stamp} (T.state):=waiting_on(C) if T.stamp