<> <> <> <> <> <> <> <> <> <> <> DIRECTORY YggEnvironment, YggImport, YggTransMgr, YggConversationTable, YggCoordinator, YggCoordinatorInternal, YggDummyProcess, YggDummyRPC; YggCoordinatorRemoteCallsImpl: CEDAR MONITOR IMPORTS <> YggDummyProcess EXPORTS YggCoordinatorInternal = BEGIN Conversation: TYPE = YggEnvironment.Conversation; TransID: TYPE = YggEnvironment.TransID; nProcessesCalling: INT _ 0; <> maxProcessesCalling: INT = 20; nProcessesIdle: INT _ 0; <> maxProcessesIdle: INT = 10; parmsTaken: CONDITION; <> parmsArrived: CONDITION; <> Parms: TYPE = YggCoordinatorInternal.Parms; parms: Parms; parmsOccupied: BOOL _ FALSE; <> Results: TYPE = YggCoordinator.Results; <> timesCalledPassParms: INT _ 0; timesWaitedOnParmsTaken: INT _ 0; <> <> PassParms: PUBLIC ENTRY PROC [p: Parms] = { ENABLE UNWIND => NULL; timesCalledPassParms _ timesCalledPassParms + 1; WHILE parmsOccupied DO timesWaitedOnParmsTaken _ timesWaitedOnParmsTaken + 1; WAIT parmsTaken; ENDLOOP; parms _ p; parmsOccupied _ TRUE; IF nProcessesIdle > 0 THEN NOTIFY parmsArrived ELSE IF nProcessesCalling < maxProcessesCalling THEN { nProcessesCalling _ nProcessesCalling + 1; TRUSTED {YggDummyProcess.Detach[FORK CallerProcess[]];}; }; }; <> CallerProcess: PROC [] = { <> <> <> alpineTransMgr: REF _ NIL; <> <> <> <> < GOTO stop];};>> <> <> <> <> <<}>> <> <> < CHECKED { whyCallFailed _ why; GOTO callFailed };>> < { };>> <<};>> <> < {>> <> <> < result _ [busy, none[]];>> < ERROR;>> < ERROR;>> <<};>> <<};>> <> <> <> <> < RETURN>> }; GetParms: ENTRY PROC [parmsPtr: --RESULT--POINTER TO Parms] = INLINE { < calling process should die.>> <> <> ENABLE UNWIND => nProcessesIdle _ nProcessesIdle - 1; nProcessesCalling _ nProcessesCalling - 1; WHILE NOT parmsOccupied DO IF nProcessesIdle = maxProcessesIdle THEN <> RETURN WITH ERROR Stop; nProcessesIdle _ nProcessesIdle + 1; WAIT parmsArrived; nProcessesIdle _ nProcessesIdle - 1; ENDLOOP; TRUSTED {parmsPtr^ _ parms;}; parmsOccupied _ FALSE; nProcessesCalling _ nProcessesCalling + 1; NOTIFY parmsTaken; }; Stop: ERROR = CODE; TRUSTED { YggDummyProcess.DisableTimeout[@parmsTaken]; YggDummyProcess.EnableAborts[@parmsTaken]; YggDummyProcess.DisableTimeout[@parmsArrived]; YggDummyProcess.EnableAborts[@parmsArrived]; }; END. <> <> <<>>