TYPE
PtrToChar = POINTER TO CHAR ;
- ProcedureChain = POINTER TO RECORD
- p : PROC ;
- prev,
- next: ProcedureChain ;
- END ;
-
- ProcedureList = RECORD
- head, tail: ProcedureChain
- END ;
-
-
VAR
- InitialProc,
- TerminateProc : ProcedureList ;
ExitValue : INTEGER ;
isTerminating,
isHalting,
END RequestDependant ;
-(*
- ExecuteReverse - execute the procedure associated with procptr
- and then proceed to try and execute all previous
- procedures in the chain.
-*)
-
-PROCEDURE ExecuteReverse (procptr: ProcedureChain) ;
-BEGIN
- WHILE procptr # NIL DO
- procptr^.p ; (* Invoke the procedure. *)
- procptr := procptr^.prev
- END
-END ExecuteReverse ;
-
-
(*
ExecuteTerminationProcedures - calls each installed termination procedure
in reverse order.
PROCEDURE ExecuteTerminationProcedures ;
BEGIN
- ExecuteReverse (TerminateProc.tail)
+ M2Dependent.ExecuteTerminationProcedures
END ExecuteTerminationProcedures ;
PROCEDURE ExecuteInitialProcedures ;
BEGIN
- ExecuteReverse (InitialProc.tail)
+ M2Dependent.ExecuteInitialProcedures
END ExecuteInitialProcedures ;
-(*
- AppendProc - append proc to the end of the procedure list
- defined by proclist.
-*)
-
-PROCEDURE AppendProc (VAR proclist: ProcedureList; proc: PROC) : BOOLEAN ;
-VAR
- pdes: ProcedureChain ;
-BEGIN
- NEW (pdes) ;
- WITH pdes^ DO
- p := proc ;
- prev := proclist.tail ;
- next := NIL
- END ;
- IF proclist.head = NIL
- THEN
- proclist.head := pdes
- END ;
- proclist.tail := pdes ;
- RETURN TRUE
-END AppendProc ;
-
-
(*
InstallTerminationProcedure - installs a procedure, p, which will
be called when the procedure
PROCEDURE InstallTerminationProcedure (p: PROC) : BOOLEAN ;
BEGIN
- RETURN AppendProc (TerminateProc, p)
+ RETURN M2Dependent.InstallTerminationProcedure (p)
END InstallTerminationProcedure ;
PROCEDURE InstallInitialProcedure (p: PROC) : BOOLEAN ;
BEGIN
- RETURN AppendProc (InitialProc, p)
+ RETURN M2Dependent.InstallInitialProcedure (p)
END InstallInitialProcedure ;
END NoException ;
-(*
- InitProcList - initialize the head and tail pointers to NIL.
-*)
-
-PROCEDURE InitProcList (VAR p: ProcedureList) ;
-BEGIN
- p.head := NIL ;
- p.tail := NIL
-END InitProcList ;
-
-
(*
Init -
*)
PROCEDURE Init ;
BEGIN
- InitProcList (InitialProc) ;
- InitProcList (TerminateProc) ;
ExitValue := 0 ;
isHalting := FALSE ;
CallExit := FALSE ; (* default by calling abort *)
dependantmodule, dependantlibname: ADDRESS) ;
+(*
+ InstallTerminationProcedure - installs a procedure, p, which will
+ be called when the procedure
+ ExecuteTerminationProcedures
+ is invoked. It returns TRUE is the
+ procedure is installed.
+*)
+
+PROCEDURE InstallTerminationProcedure (p: PROC) : BOOLEAN ;
+
+
+(*
+ ExecuteInitialProcedures - executes the initial procedures installed
+ by InstallInitialProcedure.
+*)
+
+PROCEDURE ExecuteInitialProcedures ;
+
+
+(*
+ InstallInitialProcedure - installs a procedure to be executed just
+ before the BEGIN code section of the main
+ program module.
+*)
+
+PROCEDURE InstallInitialProcedure (p: PROC) : BOOLEAN ;
+
+
+(*
+ ExecuteTerminationProcedures - calls each installed termination procedure
+ in reverse order.
+*)
+
+PROCEDURE ExecuteTerminationProcedures ;
+
+
END M2Dependent.
FROM Storage IMPORT ALLOCATE ;
FROM StrLib IMPORT StrCopy, StrLen, StrEqual ;
-IMPORT M2RTS ;
-
TYPE
PtrToChar = POINTER TO CHAR ;
next : ModuleChain ;
END ;
+ ProcedureList = RECORD
+ head, tail: ProcedureChain
+ END ;
+
+ ProcedureChain = POINTER TO RECORD
+ p : PROC ;
+ prev,
+ next: ProcedureChain ;
+ END ;
+
VAR
Modules : ARRAY DependencyState OF ModuleChain ;
DynamicInitialization,
PreTrace,
PostTrace,
ForceTrace : BOOLEAN ;
+ InitialProc,
+ TerminateProc : ProcedureList ;
(*
IF mptr^.dependency.appl
THEN
traceprintf3 (ModuleTrace, "application module: %s [%s]\n", mptr^.name, mptr^.libname);
- traceprintf (ModuleTrace, " calling M2RTS_ExecuteInitialProcedures\n");
- M2RTS.ExecuteInitialProcedures ;
+ traceprintf (ModuleTrace, " calling ExecuteInitialProcedures\n");
+ ExecuteInitialProcedures ;
traceprintf (ModuleTrace, " calling application module\n");
END ;
mptr^.init (argc, argv, envp) ;
traceprintf (ModuleTrace, " no ordered modules found during finishing\n")
ELSE
traceprintf (ModuleTrace, "ExecuteTerminationProcedures\n") ;
- M2RTS.ExecuteTerminationProcedures ;
+ ExecuteTerminationProcedures ;
traceprintf (ModuleTrace, "terminating modules in sequence\n") ;
mptr := Modules[ordered]^.prev ;
REPEAT
VAR
state: DependencyState ;
BEGIN
+ InitProcList (InitialProc) ;
+ InitProcList (TerminateProc) ;
SetupDebugFlags ;
FOR state := MIN (DependencyState) TO MAX (DependencyState) DO
Modules[state] := NIL
END CheckInitialized ;
+(*
+ ExecuteReverse - execute the procedure associated with procptr
+ and then proceed to try and execute all previous
+ procedures in the chain.
+*)
+
+PROCEDURE ExecuteReverse (procptr: ProcedureChain) ;
+BEGIN
+ WHILE procptr # NIL DO
+ procptr^.p ; (* Invoke the procedure. *)
+ procptr := procptr^.prev
+ END
+END ExecuteReverse ;
+
+
+(*
+ ExecuteTerminationProcedures - calls each installed termination procedure
+ in reverse order.
+*)
+
+PROCEDURE ExecuteTerminationProcedures ;
+BEGIN
+ ExecuteReverse (TerminateProc.tail)
+END ExecuteTerminationProcedures ;
+
+
+(*
+ ExecuteInitialProcedures - executes the initial procedures installed by
+ InstallInitialProcedure.
+*)
+
+PROCEDURE ExecuteInitialProcedures ;
+BEGIN
+ ExecuteReverse (InitialProc.tail)
+END ExecuteInitialProcedures ;
+
+
+(*
+ AppendProc - append proc to the end of the procedure list
+ defined by proclist.
+*)
+
+PROCEDURE AppendProc (VAR proclist: ProcedureList; proc: PROC) : BOOLEAN ;
+VAR
+ pdes: ProcedureChain ;
+BEGIN
+ NEW (pdes) ;
+ WITH pdes^ DO
+ p := proc ;
+ prev := proclist.tail ;
+ next := NIL
+ END ;
+ IF proclist.head = NIL
+ THEN
+ proclist.head := pdes
+ END ;
+ proclist.tail := pdes ;
+ RETURN TRUE
+END AppendProc ;
+
+
+(*
+ InstallTerminationProcedure - installs a procedure, p, which will
+ be called when the procedure
+ ExecuteTerminationProcedures
+ is invoked. It returns TRUE if the
+ procedure is installed.
+*)
+
+PROCEDURE InstallTerminationProcedure (p: PROC) : BOOLEAN ;
+BEGIN
+ RETURN AppendProc (TerminateProc, p)
+END InstallTerminationProcedure ;
+
+
+(*
+ InstallInitialProcedure - installs a procedure to be executed just
+ before the BEGIN code section of the
+ main program module.
+*)
+
+PROCEDURE InstallInitialProcedure (p: PROC) : BOOLEAN ;
+BEGIN
+ RETURN AppendProc (InitialProc, p)
+END InstallInitialProcedure ;
+
+
+(*
+ InitProcList - initialize the head and tail pointers to NIL.
+*)
+
+PROCEDURE InitProcList (VAR p: ProcedureList) ;
+BEGIN
+ p.head := NIL ;
+ p.tail := NIL
+END InitProcList ;
+
+
BEGIN
CheckInitialized
END M2Dependent.
TYPE
PtrToChar = POINTER TO CHAR ;
- ProcedureList = RECORD
- head, tail: ProcedureChain
- END ;
-
- ProcedureChain = POINTER TO RECORD
- p : PROC ;
- prev,
- next: ProcedureChain ;
- END ;
-
-
VAR
- InitialProc,
- TerminateProc: ProcedureList ;
ExitValue : INTEGER ;
isHalting,
CallExit : BOOLEAN ;
END RequestDependant ;
-(*
- ExecuteReverse - execute the procedure associated with procptr
- and then proceed to try and execute all previous
- procedures in the chain.
-*)
-
-PROCEDURE ExecuteReverse (procptr: ProcedureChain) ;
-BEGIN
- WHILE procptr # NIL DO
- procptr^.p ; (* Invoke the procedure. *)
- procptr := procptr^.prev
- END
-END ExecuteReverse ;
-
-
(*
ExecuteTerminationProcedures - calls each installed termination procedure
in reverse order.
PROCEDURE ExecuteTerminationProcedures ;
BEGIN
- ExecuteReverse (TerminateProc.tail)
+ M2Dependent.ExecuteTerminationProcedures
END ExecuteTerminationProcedures ;
PROCEDURE ExecuteInitialProcedures ;
BEGIN
- ExecuteReverse (InitialProc.tail)
+ M2Dependent.ExecuteInitialProcedures
END ExecuteInitialProcedures ;
-(*
- AppendProc - append proc to the end of the procedure list
- defined by proclist.
-*)
-
-PROCEDURE AppendProc (VAR proclist: ProcedureList; proc: PROC) : BOOLEAN ;
-VAR
- pdes: ProcedureChain ;
-BEGIN
- NEW (pdes) ;
- WITH pdes^ DO
- p := proc ;
- prev := proclist.tail ;
- next := NIL
- END ;
- IF proclist.head = NIL
- THEN
- proclist.head := pdes
- END ;
- proclist.tail := pdes ;
- RETURN TRUE
-END AppendProc ;
-
-
(*
InstallTerminationProcedure - installs a procedure, p, which will
be called when the procedure
PROCEDURE InstallTerminationProcedure (p: PROC) : BOOLEAN ;
BEGIN
- RETURN AppendProc (TerminateProc, p)
+ RETURN M2Dependent.InstallTerminationProcedure (p)
END InstallTerminationProcedure ;
PROCEDURE InstallInitialProcedure (p: PROC) : BOOLEAN ;
BEGIN
- RETURN AppendProc (InitialProc, p)
+ RETURN M2Dependent.InstallInitialProcedure (p)
END InstallInitialProcedure ;
END Length ;
-(*
- InitProcList - initialize the head and tail pointers to NIL.
-*)
-
-PROCEDURE InitProcList (VAR p: ProcedureList) ;
-BEGIN
- p.head := NIL ;
- p.tail := NIL
-END InitProcList ;
-
-
(*
Init - initialize the initial, terminate procedure lists and booleans.
*)
PROCEDURE Init ;
BEGIN
- InitProcList (InitialProc) ;
- InitProcList (TerminateProc) ;
ExitValue := 0 ;
isHalting := FALSE ;
CallExit := FALSE (* default by calling abort *)