-- FIFOConnectorCardImpl.mesa
-- last edited July 13, 1981 8:27 AM
DIRECTORY
Envelopes,
FIFOConnectorCard,
FIFOScheduler,
Process,
WF;
FIFOConnectorCardImpl: MONITOR
IMPORTS FIFOScheduler, Process, WF
EXPORTS FIFOConnectorCard = { OPEN Envelopes;
New: CONDITION;
value: CARDINAL;
dataflow: ARRAY [0..maxDataflow) OF PROCEDURE;
maxDataflow: CARDINAL = 10;
dIndex: CARDINAL ← 0;
Put: PUBLIC PROC [v: CARDINAL] = {
-- WF.WF1["Put S:%u ", v];
StuffIt[v];
DataflowComputation[];
WakeUp[];
FIFOScheduler.StandardDelay[];
Process.Yield[];
-- WF.WF0["Put F "]
};
Stuff: PUBLIC PROC [v: CARDINAL] = {
-- WF.WF1[" Stuff S:%b ", v];
StuffIt[v];
DataflowComputation[];
WakeUp[];
Process.Yield[];
-- WF.WF0[" Stuff F "]
};
StuffIt: ENTRY PROC [v: CARDINAL] = {
value ← v};
Place: PUBLIC PROC [v: CARDINAL] = {
StuffIt[v];
DataflowComputation[];
};
WakeUp: ENTRY PROC = {
BROADCAST New};
Get: PUBLIC PROC RETURNS [ret: CARDINAL] = {
-- WF.WF0[" Get S "];
ret ← GrabIt[];
FIFOScheduler.StandardDelay[];
-- WF.WF0[" Get F "]
};
Grab: PUBLIC ENTRY PROC RETURNS [ret: CARDINAL] = {
-- WF.WF0[" Grab S"];
ret ← value;
-- WF.WF0[" Grab F "]
};
GrabIt: ENTRY PROC RETURNS[CARDINAL] = {
RETURN[value]};
GetNew: PUBLIC PROC [v: CARDINAL] = {
-- WF.WF1[" GetNew S:%b ", v];
FIFOScheduler.StandardDelay[];
GetNewBody[v];
-- WF.WF0[" GetNew F"]
};
GetNewBody: ENTRY PROC[v: CARDINAL] = {
FIFOScheduler.NotifyQueue[];
DO
WAIT New;
IF v=value THEN EXIT;
ENDLOOP;
FIFOScheduler.IncCurrent[];
};
DataflowRequest: PUBLIC ENTRY PROC [p: PROCEDURE] = {
dataflow[dIndex] ← p;
dIndex ← dIndex+1};
DataflowComputation: PROC = {
i: CARDINAL;
FOR i IN [0..dIndex) DO
dataflow[i][]
ENDLOOP};
Process.DisableTimeout[@New];
}.