DIRECTORY Process, RuntimeError; ProcessImpl: CEDAR PROGRAM IMPORTS RuntimeError EXPORTS Process ~ BEGIN ConditionPointer: TYPE = Process.ConditionPointer; MonitorPointer: TYPE = Process.MonitorPointer; InitializeMonitor: PUBLIC PROC [monitor: MonitorPointer] = { DoIt: PROC [monitor: MonitorPointer] ~ TRUSTED MACHINE CODE { "XR_InitializeMonitor" }; DoIt[monitor]; }; InitializeCondition: PUBLIC PROC [condition: ConditionPointer, ticks: Ticks] = { DoIt: PROC [condition: ConditionPointer, ticks: Ticks] ~ TRUSTED MACHINE CODE { "XR_InitializeCondition" }; DoIt[condition, ticks]; }; Ticks: TYPE = Process.Ticks; Milliseconds: TYPE = Process.Milliseconds; Seconds: TYPE = Process.Seconds; MsecToTicks: PUBLIC PROC [ms: Milliseconds] RETURNS [ticks: Ticks] = { DoIt: PROC [Milliseconds] RETURNS [Ticks] ~ TRUSTED MACHINE CODE { "XR_MsecToTicks" }; ticks ¬ DoIt[ms]; }; SecondsToTicks: PUBLIC PROC [seconds: Seconds] RETURNS [ticks: Ticks] ~ { RETURN[MsecToTicks[1000*seconds]]; }; TicksToMsec: PUBLIC PROC [ticks: Ticks] RETURNS [ms: Milliseconds] = { DoIt: PROC [Ticks] RETURNS [Milliseconds] ~ TRUSTED MACHINE CODE { "XR_TicksToMsec" }; ms ¬ DoIt[ticks]; }; minTimeout: Ticks ¬ 1; SetTimeout: PUBLIC PROC [condition: ConditionPointer, ticks: Ticks] = { DoIt: PROC [condition: ConditionPointer, ticks: Ticks] ~ TRUSTED MACHINE CODE { "XR_SetTimeout" }; ticks ¬ MAX[ticks, minTimeout]; DoIt[condition, ticks]; }; DisableTimeout: PUBLIC PROC [condition: ConditionPointer] = { DoIt: PROC [condition: ConditionPointer] ~ TRUSTED MACHINE CODE { "XR_DisableTimeout" }; DoIt[condition]; }; Detach: PUBLIC PROC [p: PROCESS] = TRUSTED { DoIt: PROC [POINTER TO PROCESS] RETURNS [INT]~ TRUSTED MACHINE CODE { "XR_DetachCT" }; IF DoIt[@p]#0 THEN ERROR InvalidProcess[p]; }; GetCurrent: PUBLIC PROC RETURNS [p: PROCESS] = TRUSTED { DoIt: PROC[POINTER TO PROCESS] ~ TRUSTED MACHINE CODE { "XR_GetCurrent" }; DoIt[@p] }; Priority: TYPE = Process.Priority; SetPriority: PUBLIC PROC [p: Priority] ~ { DoIt: PROC [Priority] ~ TRUSTED MACHINE CODE { "XR_SetPriority" }; DoIt[p]; }; GetPriority: PUBLIC PROC RETURNS [Priority] = { DoIt: PROC RETURNS [Priority] ~ TRUSTED MACHINE CODE { "XR_GetPriority" }; RETURN[DoIt[]] }; Abort: PUBLIC PROC [p: PROCESS] ~ TRUSTED { DoIt: PROC [POINTER TO PROCESS] RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_AbortCT" }; IF DoIt[@p]#0 THEN ERROR InvalidProcess[p]; }; CancelAbort: PUBLIC PROC [p: PROCESS] ~ TRUSTED { DoIt: PROC [POINTER TO PROCESS] RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_CancelAbort" }; IF DoIt[@p]#0 THEN ERROR InvalidProcess[p]; }; AbortPending: PUBLIC PROC [] RETURNS [abortPending: BOOLEAN] ~ TRUSTED { DoIt: PROC [] RETURNS [BOOLEAN] ~ TRUSTED MACHINE CODE { "XR_AbortPending" }; RETURN [DoIt[]]; }; CheckForAbort: PUBLIC PROC ~ { AbortPending: PROC RETURNS [BOOL] ~ TRUSTED MACHINE CODE { "XR_AbortPending" }; CancelAbort: PROC [POINTER TO PROCESS] RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_CancelAbort" }; IF AbortPending[] THEN { [] ¬ CancelAbort[NIL]; ERROR ABORTED; } }; DisableAborts: PUBLIC PROC [pCondition: ConditionPointer] = { DoIt: PROC [pCondition: ConditionPointer] ~ TRUSTED MACHINE CODE { "XR_DisableAborts" }; DoIt[pCondition]; }; EnableAborts: PUBLIC PROC [pCondition: ConditionPointer] = { DoIt: PROC [pCondition: ConditionPointer] ~ TRUSTED MACHINE CODE { "XR_EnableAborts" }; DoIt[pCondition]; }; Pause: PUBLIC PROC [ticks: Ticks] ~ TRUSTED { DoIt: PROC [CARD] RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_PauseAbortable" }; IF DoIt[ticks] # 0 THEN ERROR ABORTED; }; PauseMsec: PUBLIC PROC [ms: Milliseconds] ~ { ticks: Ticks ¬ MsecToTicks[ms]; Pause[ticks] }; Yield: PUBLIC PROC ~ { DoIt: PROC ~ TRUSTED MACHINE CODE { "XR_Yield" }; DoIt[]; }; ValidateProcess: PUBLIC PROC [p: PROCESS] ~ TRUSTED { DoIt: PROC [POINTER TO PROCESS] RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_ValidateCT" }; IF DoIt[@p]#0 THEN ERROR InvalidProcess[p]; }; InvalidProcess: PUBLIC ERROR [process: PROCESS] ¬ RuntimeError.InvalidProcess; ExternalNames: PROC [] = TRUSTED MACHINE CODE { "^ExternalNames\n"; "XRWait XR_Wait\n"; }; XRWaitCV: PROC [cond: POINTER, lock: POINTER] RETURNS [i: INT] ~ TRUSTED MACHINE CODE {"XR_WaitCV"}; XRWait: PROC [lock: POINTER, cond: POINTER] = { IF XRWaitCV[cond, lock] # 0 THEN ERROR RuntimeError.Aborted }; abortableJoin: BOOL ¬ TRUE; badRES: INT ¬ 0; -- for debug ExternalNames[]; END. Ϊ ProcessImpl.mesa Copyright Σ 1988, 1991, 1992, 1993 by Xerox Corporation. All rights reserved. Carl Hauser, February 16, 1989 1:49:07 pm PST Foote, May 31, 1991 11:17 am PDT Michael Plass, March 12, 1992 11:33 am PST Willie-s, January 26, 1993 2:59 pm PST Initializing monitors and condition variables Ticks Timeouts Detaching processes Identity of the currently executing process Priorities of processes Aborts Requests that the indicated process be aborted. Cancels abort request for process. Control of Scheduling Process validation Process support (formerly in ProcessSupport.c) "XRJoin XR_Join\n" Should WaitCV and JoinCT come from a PCROps.mesa interface or some such? XRJoin: PROC [process: PROCESS] RETURNS [POINTER] = TRUSTED { NegErrno: TYPE ~ INT; EABORTED: NegErrno ~ -1024; -- cf UnixErrno.mesa XRTryJoinCT: PROC [pp: POINTER TO PROCESS, abortable: BOOL, resultp: POINTER TO POINTER] RETURNS [NegErrno] ~ TRUSTED MACHINE CODE {"XR_TryJoinCT"}; r: POINTER ¬ NIL; res: NegErrno ~ XRTryJoinCT[pp: @process, abortable: abortableJoin, resultp: @r]; SELECT res FROM 0 => RETURN [r]; EABORTED => ERROR ABORTED; ENDCASE => { badRES ¬ res; ERROR RuntimeError.InvalidProcess[process] }; }; XRJoin: PROC [process: PROCESS] RETURNS [POINTER] = TRUSTED { XRJoinCT: PROC [pp: POINTER TO PROCESS] RETURNS [POINTER] ~ TRUSTED MACHINE CODE {"XR_JoinCT"}; r: POINTER ¬ XRJoinCT[@process]; IF LOOPHOLE[r, INT] = -1 THEN ERROR RuntimeError.InvalidProcess[process]; RETURN[r]}; CHauser, February 16, 1989: Fixed bug in CheckForAbort. Didn't clear the abort request. CHauser, February 21, 1989: Added CancelAbort. JKF, May 31, 1991 11:16:43 am PDT: Folded in ProcessSupport.c. MFP, March 4, 1992 11:41:12 pm PST: provided for abortable JOIN Κ O–(cedarcode) style•NewlineDelimiter ™™Icodešœ ΟeœC™NK™-K™ K™*K™&K™—šΟk ˜ Kšœ˜Kšœ ˜ K˜—KšΟn œž ˜Kšžœ ˜Kšžœ˜Kšœž˜headšœ.™.Kšœžœ˜2Kšœžœ˜.K˜šŸœžœžœ˜<š Ÿœžœžœžœžœ˜=Kšœ˜K˜—Kšœ˜Kšœ˜—K˜šŸœžœžœ0˜Pš Ÿœžœ/žœžœžœ˜OKšœ˜K˜—Kšœ˜Kšœ˜——šœ™Kšœžœ˜Kšœžœ˜*Kšœ žœ˜ K˜šŸ œžœžœžœ˜Fš Ÿœžœžœ žœžœžœ˜BKšœ˜K˜—Kšœ˜Kšœ˜K˜—šŸœžœžœžœ˜IKšžœ˜"Kšœ˜K˜—šŸ œžœžœžœ˜Fš Ÿœžœ žœžœžœžœ˜BKšœ˜K˜—Kšœ˜Kšœ˜——K˜šœ™Kšœ˜K˜šŸ œž œ,žœ˜Gš Ÿœžœ/žœžœžœ˜OKšœ˜K˜—Kšœžœ˜Kšœ˜Kšœ˜K˜—šŸœž œ žœžœ˜=š Ÿœžœ!žœžœžœ˜AKšœ˜K˜—Kšœ˜Kšœ˜——K˜šœ™šŸœž œžœžœ˜,šŸœžœžœžœžœžœžœžœ˜EKšœ ˜ K˜—Kšžœ žœžœ˜+Kšœ˜K˜——šœ+™+š Ÿ œžœžœžœžœžœ˜8šŸœžœžœžœžœžœžœžœ˜7Kšœ˜K˜—Kšœ˜Kšœ˜K˜——šœ™Kšœ žœ˜"K˜šŸ œžœžœ˜*š Ÿœžœžœžœžœ˜.Kšœ˜K˜—Kšœ˜Kšœ˜K˜—šŸ œž œžœ žœ˜/š Ÿœžœžœžœžœžœ˜6Kšœ˜K˜—Kšžœ˜Kšœ˜K˜——šœ™š Ÿœžœžœžœžœ˜+šŸœžœžœžœžœžœžœžœžœžœ˜FKšœ ˜ K˜—Kšžœ žœžœ˜+Kšœ˜Kšœ1™1K˜—š Ÿ œžœžœžœžœ˜1šŸœžœžœžœžœžœžœžœžœžœ˜FKšœ˜K˜—Kšžœ žœžœ˜+Kšœ˜Kšœ$™$K˜—š Ÿ œžœžœžœžœžœ˜HšŸœžœžœžœžœžœžœ˜8Kšœ˜K˜—Kšžœ ˜Kšœ˜K˜—šŸ œž œ˜šŸ œžœžœžœžœžœžœ˜:Kšœ˜K˜—šŸ œžœžœžœžœžœžœžœžœžœ˜MKšœ˜K˜—šžœžœ˜Kšœžœ˜Kšžœžœ˜K˜—Kšœ˜K˜—šŸ œž œžœ˜=š Ÿœžœ!žœžœžœ˜BKšœ˜K˜—Kšœ˜Kšœ˜K˜—šŸ œž œ#˜<š Ÿœžœ!žœžœžœ˜BKšœ˜K˜—Kšœ˜Kšœ˜K˜——šœ™šŸœžœžœžœ˜-šŸœžœžœžœžœžœžœžœ˜8Kšœ˜K˜—Kšžœžœžœžœ˜&Kšœ˜K˜—šŸ œžœžœ˜-K˜K˜ Kšœ˜K˜—šŸœžœžœ˜š Ÿœžœžœžœžœ˜#Kšœ ˜ K˜—K˜Kšœ˜——šœ™š Ÿœžœžœžœžœ˜5šŸœžœžœžœžœžœžœžœ˜FKšœ˜K˜—Kšžœ žœžœ˜+Kšœ˜—K˜KšŸœž œ žœ ˜N—šœ.™.š Ÿ œžœžœžœžœ˜/Kšœ˜Kšœ˜K™K˜K˜—K™HKšŸœžœžœžœžœžœžœžœžœ˜dK˜šŸœžœžœžœ˜/Kšžœžœžœ˜;K˜——˜Kšœžœžœ˜KšœžœΟc ˜š Ÿœžœ žœžœžœžœ™=Kšœ žœžœ™Kšžœ ™0KšŸ œžœžœžœžœ žœ žœžœžœžœžœžœžœ™”Kšœžœžœ™K™Qšžœž™Kšœžœ™Kšžœžœžœ™Kšžœžœ(™H—K™K™—š Ÿœžœ žœžœžœžœ™=KšŸœžœžœžœžœžœžœžœžœžœ™_Kšœžœ™ Kš žœžœžœžœžœ&™IKšžœ™ K™—Kšœ˜—K˜Kšžœ˜K˜J™XJ™.J™>J™?—…—,"U