-- File: [Indigo]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.