-- BBAction.mesa -- Russ Atkinson, November 1, 1982 3:30 pm DIRECTORY AMEvents USING [Event]; BBAction: CEDAR DEFINITIONS = BEGIN ActionId: TYPE = INT; -- unique id for the action, these are never reused -- only positive integers are used Action: TYPE = REF ActionRep; Event: TYPE = AMEvents.Event; ActionKind: TYPE = {break, signal, other}; ActionStatus: TYPE = {new, busy, pendingIn, pendingOut, dead}; ActionRep: TYPE = RECORD [id: ActionId, rest: Action, kind: ActionKind, status: ActionStatus, event: Event, in,out: REF ]; ActionError: ERROR; -- error given when pre-condition not met NewAction: PROC [event: Event, kind: ActionKind _ other] RETURNS [Action]; -- creates a new action with new id and given kind WaitForDataGiven: PROC [action: Action] RETURNS [REF]; -- suspends caller (as pendingIn) until data is given -- data is returned from the call when proceding WaitForDataTaken: PROC [action: Action, out: REF]; -- suspends caller (as pendingOut) until data (out) is taken -- when the data is taken, the process proceeds (busy) WaitForChange: PROC [changeCount: INT _ 0] RETURNS [INT]; -- suspends caller until the change count is different than -- the given changeCount, then returns the new change count -- the changeCount will change for every time a process becomes pending, -- busy, or dead; the change count may wrap around, but will always -- be > 0; therefore the default will not wait, but will return the -- current count ForceChange: PROC; -- forces a change to the change count GetChangeCount: PROC RETURNS [INT]; -- get the current change count NextPendingAction: PROC [action: Action _ NIL] RETURNS [Action]; -- returns the next eldest pending action -- returns NIL if no pending actions in list -- start with NIL to get most recent NextAction: PROC [action: Action _ NIL] RETURNS [Action]; -- returns the next eldest action -- returns NIL if no actions in list -- start with NIL to get most recent GiveData: PROC [action: Action, in: REF]; -- supplies the input data, allows the action to proceed TakeData: PROC [action: Action] RETURNS [REF]; -- obtains the output data, allows the action to proceed PeekData: PROC [action: Action] RETURNS [REF]; -- obtains the output data, does not allow process to proceed Abort: PROC [action: Action]; -- aborts the pending action -- causes ERROR ABORTED in the associated process END.