-- Stub file was translated on February 1, 1984 5:22:08 pm PST by Lupine of December 20, 1983 1:22:57 pm PST -- Source interface AlpineFile came from file AlpineFile.bcd, which was created on February 1, 1984 5:21:52 pm PST with version stamp 151#27#13440653423 from source of October 28, 1983 12:51:11 pm PDT. -- The RPC stub modules for AlpineFile are: -- AlpineFileRpcControl.mesa; -- AlpineFileRpcClientImpl.mesa; -- AlpineFileRpcBinderImpl.mesa; -- AlpineFileRpcServerImpl.mesa. -- The parameters for this translation are: -- Target language = Cedar -- Default parameter passing = VALUE -- Deallocate server heap arguments = TRUE -- Inline RpcServerImpl dispatcher stubs = FALSE -- Declare signals = FALSE -- Warn about short POINTER ("MDS") allocations = TRUE -- 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 AlpineFile, AlpineFileRpcControl USING [InterfaceRecord, InterfaceRecordObject], AlpineFileRpcClientImpl, RPC USING [InterfaceName, Zones], SafeStorage USING [EnableFinalization, EstablishFinalization, FinalizationQueue, FQEmpty, FQNext, NewFQ]; AlpineFileRpcBinderImpl: MONITOR IMPORTS AlpineFile, ClientPrototype: AlpineFileRpcClientImpl, RTT: SafeStorage EXPORTS AlpineFileRpcControl SHARES AlpineFile, AlpineFileRpcControl = BEGIN OPEN RpcControl: AlpineFileRpcControl, 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[AlpineFileRpcClientImpl]; 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^ _ [ Open: module.Open, Create: module.Create, Close: module.Close, Delete: module.Delete, GetUniversalFile: module.GetUniversalFile, GetTransID: module.GetTransID, GetAccessRights: module.GetAccessRights, GetLockOption: module.GetLockOption, SetLockOption: module.SetLockOption, GetRecoveryOption: module.GetRecoveryOption, GetReferencePattern: module.GetReferencePattern, SetReferencePattern: module.SetReferencePattern, ReadPages: module.ReadPages, WritePages: module.WritePages, LockPages: module.LockPages, UnlockPages: module.UnlockPages, ReadProperties: module.ReadProperties, WriteProperties: module.WriteProperties, UnlockVersion: module.UnlockVersion, IncrementVersion: module.IncrementVersion, GetSize: module.GetSize, SetSize: module.SetSize, AccessFailed: AlpineFile.AccessFailed, LockFailed: AlpineFile.LockFailed, OperationFailed: AlpineFile.OperationFailed, StaticallyInvalid: AlpineFile.StaticallyInvalid, Unknown: AlpineFile.Unknown, PossiblyDamaged: AlpineFile.PossiblyDamaged]; ChainNewInterface[]; END; RTT.EnableFinalization[interface]; 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. -- AlpineFileRpcBinderImpl.