-- File: [Indigo]<Sakura>Dragon>DragonArbiterImpl1.sak -- 15-Mar-82 9:19:33 DIRECTORY DragonArbiter1: TYPE, SakuraRT: TYPE; DragonArbiterImpl1: MONITOR IMPORTS SakuraRT EXPORTS DragonArbiter1 = BEGIN Arbiter: PUBLIC PROC [ClockA, ClockB, Proc1Rq, Proc2Rq: SakuraRT.Handle, Proc1Gr, Proc2Gr: SakuraRT.Handle] = { granted: BOOLEAN ← FALSE; last: CARDINAL ← 0; Grant: ENTRY PROC = { IF last = 1 THEN IF NARROW[SakuraRT.Get[Proc1Rq], REF BOOLEAN]↑ AND granted THEN RETURN ELSE IF NARROW[SakuraRT.Get[Proc2Rq], REF BOOLEAN]↑ THEN {SakuraRT.Put[Proc1Gr, NEW[BOOLEAN ← FALSE]]; last ← 2; SakuraRT.Put[Proc2Gr, NEW[BOOLEAN ← TRUE]]; granted ← TRUE} ELSE IF NARROW[SakuraRT.Get[Proc1Rq], REF BOOLEAN]↑ THEN {SakuraRT.Put[Proc1Gr, NEW[BOOLEAN ← TRUE]]; granted ← TRUE} ELSE {SakuraRT.Put[Proc1Gr, NEW[BOOLEAN ← FALSE]]; granted ← FALSE} ELSE IF last = 2 THEN IF NARROW[SakuraRT.Get[Proc2Rq], REF BOOLEAN]↑ AND granted THEN RETURN ELSE IF NARROW[SakuraRT.Get[Proc1Rq], REF BOOLEAN]↑ THEN {SakuraRT.Put[Proc2Gr, NEW[BOOLEAN ← FALSE]]; last ← 1; SakuraRT.Put[Proc1Gr, NEW[BOOLEAN ← TRUE]]; granted ← TRUE} ELSE IF NARROW[SakuraRT.Get[Proc2Rq], REF BOOLEAN]↑ THEN {SakuraRT.Put[Proc2Gr, NEW[BOOLEAN ← TRUE]]; granted ← TRUE} ELSE {SakuraRT.Put[Proc2Gr, NEW[BOOLEAN ← FALSE]]; granted ← FALSE} ELSE IF NARROW[SakuraRT.Get[Proc1Rq], REF BOOLEAN]↑ THEN {last ← 1; SakuraRT.Put[Proc1Gr, NEW[BOOLEAN ← TRUE]]; granted ← TRUE} ELSE IF NARROW[SakuraRT.Get[Proc2Rq], REF BOOLEAN]↑ THEN {last ← 2; SakuraRT.Put[Proc2Gr, NEW[BOOLEAN ← TRUE]]; granted ← TRUE}}; -- Grant {ENABLE {ABORTED => GO TO Aborted}; DO SakuraRT.GetNew[ClockB, TRUE]; Grant[] ENDLOOP; SakuraRT.ProcessEnd[]} EXITS Aborted => SakuraRT.Abort[]}; END.