Overview
Compared to EPO, version 8.0, module Modules
is changed as follows:
- pick up the stack size setting from module
Kernel
- remove all freed module slots at the top of the module list
Stack Size
IMPORT Kernel;
PROCEDURE Init*;
BEGIN
(* ... *)
DEC(limit, Kernel.stackSize)
(* was: DEC(limit, 8000H); *)
END Init;
Modules.Free
In EPO and PO, Modules.Free
will just mark the now unallocated memory slots as available, even if they are “at the top” of the module list (at module.root, “top” as in the list via System.ShowModules
). Subsequent loading of a new module can thus result in unnecessary fragmentation. The solution below “cleans out” all free module slots at the top: module.root
and AllocPtr
are “adjusted down” to the first module slot actually in use.
PROCEDURE Free*(name: ARRAY OF CHAR);
VAR mod, imp: Module; p, q: INTEGER;
BEGIN mod := root; res := 0;
WHILE (mod # NIL) & (mod.name # name) DO mod := mod.next END ;
IF mod # NIL THEN
IF mod.refcnt = 0 THEN
mod.name[0] := 0X; p := mod.imp; q := mod.cmd;
WHILE p < q DO SYSTEM.GET(p, imp); DEC(imp.refcnt); INC(p, 4) END ;
(* clean out any unallocated top slots *)
IF mod = root THEN
WHILE root.name[0] = 0X DO
AllocPtr := SYSTEM.VAL(INTEGER, root); root := root.next
END
END
(* --- *)
ELSE res := 1
END
END
END Free;