AlpineImportImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Last edited by
MBrown on January 30, 1984 11:58:06 am PST
Hauser, March 7, 1985 2:15:23 pm PST
NOTES
The response to RPC.ImportFailure{wrongVersion, unbound, stubProtocol} should
be more intelligent than just returning NIL for the interface. But I dislike
signalling out of a monitor.
DIRECTORY
AlpineEnvironment,
AlpineImport USING [Handle],
AlpineTransMgrRpcControl,
BasicTime,
RPC;
AlpineImportImpl:
MONITOR
LOCKS s.first
USING s: AlpineImport.Handle
IMPORTS
AlpineTransMgrRpcControl,
BasicTime,
RPC
= BEGIN
TransMgrInterfaceCallFailed:
PUBLIC
ENTRY
PROC [
s: AlpineImport.Handle,
i: AlpineTransMgrRpcControl.InterfaceRecord] = {
IF s.first.local THEN ERROR;
IF s.first.transMgrInterface = i
THEN {
s.first.mostRecentBind ← BasicTime.earliestGMT;
s.first.transMgrInterface ← NIL;
};
};
NewInterfaces: PUBLIC PROC [s: AlpineImport.Handle] =
{
Makes one attempt to fill in all of the unbound interfaces in s.
If s is remote and an ImportNewInterface call failed recently, then
this procedure returns without calling ImportNewInterface again.
IF BasicTime.Period[from: s.first.mostRecentBind, to: BasicTime.Now[]] < importRetryInterval
THEN GOTO BindingFailed;
BEGIN
ENABLE
RPC.ImportFailed =>
SELECT why
FROM
communications =>
GOTO BindingFailed;
Transient problem, caller will retry if necessary.
badType, badInstance, badVersion =>
ERROR;
These represent server bugs that should be fixed NOW.
wrongVersion, unbound, stubProtocol =>
GOTO BindingFailed;
These represent server problems, but not impossible ones.
ENDCASE => ERROR;
s.first.mostRecentBind ← BasicTime.Now[];
IF s.first.transMgrInterface =
NIL
THEN
s.first.transMgrInterface ← AlpineTransMgrRpcControl.ImportNewInterface[
interfaceName: [type: "AlpineTransMgr.alpine", instance: s.first.server]];
END --ENABLE--;
EXITS
BindingFailed => NULL;
};
importRetryInterval: INT = 15; -- seconds --
END.--AlpineImportImpl
Hauser, March 7, 1985 2:15:02 pm PST
Nodified, added copyright.