-- AlpineImport.mesa
-- Shared communication paths (interface instances) to Alpine servers.
-- One instance per machine, NOT one per FileStore.
-- Last edited by
-- MBrown on January 30, 1984 11:49:28 am PST
-- Taft on 1-Feb-82 13:01:29
-- NOTES:
-- Right now the only path used between servers is AlpineTransMgr, but someday
--other interfaces will be used (for instance, to detect lock cycles).
-- We do not (yet) allow Unregister. The time-stamp that Register records should help.
-- If we allow Unregistering, then we'll have to change the implementation of
--Equal to compare server names.
DIRECTORY
AlpineEnvironment,
AlpineTransMgrRpcControl,
BasicTime;
AlpineImport: DEFINITIONS LOCKS s.first USING s: Handle =
BEGIN
-- Handle: TYPE = REF opaque; (really defined below, allowing us to use inlines)
Register: PROC [server: AlpineEnvironment.FileStore] RETURNS [Handle];
-- Returns a Handle that is (permanently) associated with the indicated server.
-- This call performs no communication; in particular, there is no guarantee that
--a Handle ever contains an interface bound to the indicated server.
-- Client may use the built-in assignment operation on Handles, and may
--use the following additional operations:
Equal: PROC [s, t: Handle] RETURNS [BOOLEAN] = INLINE {
RETURN [s=t] };
Name: PROC [s: Handle] RETURNS [AlpineEnvironment.FileStore] = INLINE {
RETURN [s.first.server] };
GetTransMgrInterface: ENTRY PROC [s: Handle]
RETURNS [AlpineTransMgrRpcControl.InterfaceRecord] = INLINE {
ENABLE UNWIND => NULL;
IF s.first.transMgrInterface = NIL THEN NewInterfaces[s];
RETURN [s.first.transMgrInterface] };
-- Makes one binding try, and returns NIL as the second result if it fails.
--Otherwise returns an AlpineCoordinator interface that is bound to the server
--implied by Handle s.
-- It is CRUCIAL that the client hang on to the REF AlpineCoordinatorIR during
--any call made through the interface; this is what prevents the binding of the
--interface from changing out from under the client. This is guaranteed as long
--as the client does not FORK the interface procedure or pass the procedure value
--to someone else.
TransMgrInterfaceCallFailed: PROC [
s: Handle, i: AlpineTransMgrRpcControl.InterfaceRecord];
-- This call serves notice that a call made through interface i, which was derived
--from Handle s, has failed and hence the interface should probably be discarded.
-- The following should be considered opaque to the client, but is here to allow
--Equal, Name, and GetTransMgrInterface to be defined inline.
Object: TYPE = MONITORED RECORD [
server: AlpineEnvironment.FileStore,
-- immutable, since clients store Handles in their data structures.
local: BOOL ← FALSE,
-- part of the kludge for providing local calls: tells ConversationTable what to do
mostRecentRegister: BasicTime.GMT,
mostRecentBind: BasicTime.GMT,
transMgrInterface: AlpineTransMgrRpcControl.InterfaceRecord ← NIL
--protected by monitor
];
Handle: TYPE = LIST OF Object;
nullHandle: Handle = NIL;
NewInterfaces: PRIVATE PROC [s: Handle];
-- ! (none.)
END.--AlpineImport