<<>> <> <> <> <> DIRECTORY ProcessProps USING [], List USING [AList]; ProcessPropsImpl: CEDAR MONITOR EXPORTS ProcessProps = BEGIN OPEN List; AddPropList: PUBLIC PROC [propList: AList, inner: PROC] = TRUSTED { <<... adds the given properties to the current process for the duration of the call of inner. The old property list for the process will not be altered, but will be found at the end of the propety list during the call to inner. The old property list will be restored after the call has completed. The new propList will be copied if an old property list exists.>> old: AList = NARROW[GetProcessProperty[]]; IF old # NIL THEN { tail: AList ¬ NIL; FOR each: AList ¬ propList, each.rest WHILE each # NIL DO new: AList = LIST[each.first]; IF tail = NIL THEN propList ¬ new ELSE tail.rest ¬ new; tail ¬ new; ENDLOOP; IF tail = NIL THEN propList ¬ old ELSE tail.rest ¬ old; }; SetProcessProperty[propList]; inner[! UNWIND => SetProcessProperty[old]]; SetProcessProperty[old]; }; PushPropList: PUBLIC PROC [propList: AList, inner: PROC] = { <<... sets the property list for the current process for the duration of the call of inner. The old property list will be restored after the call has completed. The new propList will not be copied. Most applications should use AddPropList to properly inherit properties.>> old: AList = NARROW[GetProcessProperty[]]; SetProcessProperty[propList]; inner[! UNWIND => SetProcessProperty[old]]; SetProcessProperty[old]; }; <<>> GetPropList: PUBLIC PROC RETURNS [propList: AList ¬ NIL] = TRUSTED { <<... returns the current property list for the current process. Although there is no prohibition from altering the returned list, users are encouraged to follow the style of adding new properties, rather than changing old associations.>> propList ¬ NARROW[GetProcessProperty[]]; }; GetProp: PUBLIC PROC [key: REF] RETURNS [prop: REF ¬ NIL] = TRUSTED { <<... returns the current property associated with the given key for the current process. This procedure is preferred to GetPropList for most applications.>> propList: AList ¬ NARROW[GetProcessProperty[]]; WHILE propList # NIL DO IF propList.first.key = key THEN RETURN [propList.first.val]; propList ¬ propList.rest; ENDLOOP; }; GetProcessProperty: PROC RETURNS [prop: REF] ~ TRUSTED MACHINE CODE { "XR_GetThreadProperty" }; SetProcessProperty: PROC [prop: REF] ~ TRUSTED MACHINE CODE { "XR_SetThreadProperty" }; <> <<>> <> <<[process: PROCESS] RETURNS [propList: AList _ NIL] = TRUSTED {>> <<... returns the current property list for the specified process>> <> <> <<};>> <<>> <> <<... returns the next process with a non-NIL propList. Use GetNextPropList[NIL] to start the iteration. [NIL, NIL] will be returned if no more processes exist. The processes are produced in increasing order. There is a very small probability of a race with AddPropList and PushPropList, but it must result in a bounded number of retries.>> < NULL;>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<};>> <<>> END.