-- Stub file AlpineOwnerRpcBinderImpl.mesa was translated on 7-Jun-83 -- 11:45:22 PDT by Lupine of 18-Feb-83 11:25:52 PST. -- edited by kolling on June 7, 1983 11:48 am. -- Source interface AlpineOwner came from file AlpineOwner.bcd, which -- was created on 7-Jun-83 11:44:53 PDT with version stamp 117#174#6244075503 -- from source of 2-Apr-83 13:52:55 PST. -- The RPC stub modules for AlpineOwner are: -- AlpineOwnerRpcControl.mesa; -- AlpineOwnerRpcClientImpl.mesa; -- AlpineOwnerRpcBinderImpl.mesa; -- AlpineOwnerRpcServerImpl.mesa. -- The parameters for this translation are: -- Target language = Cedar; -- Default parameter passing = VALUE; -- Deallocate server heap arguments = TRUE; -- Inline RpcServerImpl dispatcher stubs = FALSE; -- Maximum number of dynamic heap NEWs = 50, MDS NEWs = 50; -- Acceptable parameter protocols = VersionRange[1,1]. -- NOTE: Discard this module unless you use dynamic client binding. DIRECTORY AlpineOwner, AlpineOwnerRpcControl USING [InterfaceRecord, InterfaceRecordObject], AlpineOwnerRpcClientImpl, RPC USING [InterfaceName, Zones], RTTypesBasic USING [EstablishFinalization, FinalizationQueue, FQEmpty, FQNext, NewFQ]; AlpineOwnerRpcBinderImpl: MONITOR IMPORTS AlpineOwner, ClientPrototype: AlpineOwnerRpcClientImpl, RTT: RTTypesBasic EXPORTS AlpineOwnerRpcControl SHARES AlpineOwnerRpcControl = BEGIN OPEN RpcControl: AlpineOwnerRpcControl, RpcPublic: RPC; -- Dynamic instantiation and binding routines. ImportNewInterface: PUBLIC SAFE PROCEDURE [ interfaceName: RpcPublic.InterfaceName, parameterStorage: RpcPublic.Zones ] RETURNS [interfaceRecord: RpcControl.InterfaceRecord] = TRUSTED BEGIN interfaceRecord ← NewInterface[]; LupineDetails[interfaceRecord].module.ImportInterface [ interfaceName: interfaceName, parameterStorage: parameterStorage ! UNWIND => FreeInterface[interfaceRecord] ]; END; UnimportNewInterface: SAFE PROCEDURE [ interfaceRecord: RpcControl.InterfaceRecord ] = TRUSTED BEGIN LupineDetails[interfaceRecord].module.UnimportInterface[]; FreeInterface[interfaceRecord]; END; -- Utility routines for interface instantiation and caching. ConcreteLupineDetails: TYPE = REF LupineDetailsObject; LupineDetailsObject: PUBLIC TYPE = RECORD [ module: ClientModule←NIL, list: RpcControl.InterfaceRecord←NIL, --package reference next: RpcControl.InterfaceRecord←NIL --free list -- ]; LupineDetails: PROCEDURE [abstractInterface: RpcControl.InterfaceRecord] RETURNS [ConcreteLupineDetails] = INLINE {RETURN[abstractInterface.lupineDetails]}; ClientModule: TYPE = POINTER TO FRAME[AlpineOwnerRpcClientImpl]; clientInterfaceCache: RpcControl.InterfaceRecord ← NIL; -- free interface -- records clientInterfaceList: RpcControl.InterfaceRecord ← NIL; -- all interface -- records NewInterfaceRecord: PUBLIC SAFE PROCEDURE RETURNS [interfaceRecord: RpcControl.InterfaceRecord] = TRUSTED BEGIN interfaceRecord ← NEW[RpcControl.InterfaceRecordObject]; END; NewInterface: PROCEDURE RETURNS [interface: RpcControl.InterfaceRecord]= BEGIN GetCachedInterface: ENTRY PROCEDURE RETURNS [cachedIR: RpcControl.InterfaceRecord] = INLINE BEGIN ENABLE UNWIND => NULL; IF (cachedIR←clientInterfaceCache) # NIL THEN clientInterfaceCache ← LupineDetails[clientInterfaceCache].next; END; ReclaimInterfaces[]; IF (interface ← GetCachedInterface[]) = NIL THEN BEGIN ChainNewInterface: ENTRY PROCEDURE = INLINE BEGIN ENABLE UNWIND => NULL; interface.lupineDetails ← NEW[ LupineDetailsObject ← [module: module, list: clientInterfaceList]]; clientInterfaceList ← interface; END; -- ChainNewInterface. module: ClientModule = NEW ClientPrototype; interface ← NewInterfaceRecord[]; interface↑ ← [ ReadProperties: module.ReadProperties, WriteProperties: module.WriteProperties, Create: module.Create, Destroy: module.Destroy, ReadNext: module.ReadNext, ReadDBProperties: module.ReadDBProperties, ReorganizeDB: module.ReorganizeDB, AccessFailed: AlpineOwner.AccessFailed, LockFailed: AlpineOwner.LockFailed, OperationFailed: AlpineOwner.OperationFailed, StaticallyInvalid: AlpineOwner.StaticallyInvalid, Unknown: AlpineOwner.Unknown]; ChainNewInterface[]; END; END; FreeInterface: ENTRY PROCEDURE [interface: RpcControl.InterfaceRecord]= INLINE BEGIN ENABLE UNWIND => NULL; LupineDetails[interface].next ← clientInterfaceCache; clientInterfaceCache ← interface; END; -- Finalization for dynamic interfaces. Just cache and reuse for now. freedInterfaces: RTT.FinalizationQueue = RTT.NewFQ[20]; ReclaimInterfaces: PROCEDURE = INLINE BEGIN WHILE ~RTT.FQEmpty[freedInterfaces] DO interface: RpcControl.InterfaceRecord = NARROW[RTT.FQNext[freedInterfaces]]; IF interface.lupineDetails # NIL THEN UnimportNewInterface[interface]; ENDLOOP; END; -- Module initialization. RTT.EstablishFinalization[ type: CODE[RpcControl.InterfaceRecordObject], npr: 1, fq: freedInterfaces ]; END. -- AlpineOwnerRpcBinderImpl.