declare class TMClass attr timestamp tm meth init(TM) timestamp:=0 tm:=TM end meth Unlockall(T RestoreFlag) for save(cell:C state:S) in {Dictionary.items T.save} do (C.owner):=unit if RestoreFlag then (C.state):=S end if {Not {C.queue.isEmpty}} then Sync2#T2={C.queue.dequeue} in (T2.state):=running (C.owner):=T2 Sync2=ok end end end meth Trans(P ?R TS) /* See next figure */ end meth getlock(T C ?Sync) /* See next figure */ end meth newtrans(P ?R) timestamp:=@timestamp+1 {self Trans(P R @timestamp)} end meth savestate(T C ?Sync) if {Not {Dictionary.member T.save C.name}} then (T.save).(C.name):=save(cell:C state:@(C.state)) end Sync=ok end meth commit(T) {self Unlockall(T false)} end meth abort(T) {self Unlockall(T true)} end end proc {NewTrans ?Trans ?NewCellT} TM={NewActive TMClass init(TM)} in fun {Trans P ?B} R in {TM newtrans(P R)} case R of abort then B=abort unit [] abort(Exc) then B=abort raise Exc end [] commit(Res) then B=commit Res end end fun {NewCellT X} cell(name:{NewName} owner:{NewCell unit} queue:{NewPrioQueue} state:{NewCell X}) end end