<<>> <> <> <> DIRECTORY Process USING [ConditionPointer, EnableAborts, InitializeCondition, SecondsToTicks]; AbortLockTest: CEDAR MONITOR IMPORTS Process = BEGIN change: CONDITION; wait: BOOL _ FALSE; unwinds: ARRAY Where OF BOOL _ ALL[FALSE]; Where: TYPE = {inner, inside, call}; OuterReEnter: PROC [x: NAT] = { ENABLE UNWIND => EnterAndSet[x]; Enter[]; }; OuterEnter: PROC = { Enter[!UNWIND => unwinds[call] _ TRUE]; }; Enter: ENTRY PROC = { ENABLE UNWIND => {unwinds[inside] _ TRUE}; Inner[]; }; Inner: INTERNAL PROC = { ENABLE UNWIND => {unwinds[inner] _ TRUE}; WHILE wait DO WAIT change ENDLOOP; }; EnterAndSet: ENTRY PROC [x: NAT] = {memory _ x}; memory: NAT _ 0; Start: PROC = TRUSTED { cp: Process.ConditionPointer = @change; Process.InitializeCondition[cp, Process.SecondsToTicks[15]]; Process.EnableAborts[cp]; }; Start[]; END.