-- GVSwitches.mesa
-- Brenda Hankins 17-Aug-84 12:18:50 (Klamath update)
-- Ted Wobber 8-Mar-83 11:17:31
DIRECTORY
Environment USING [bytesPerPage],
Event,
GVPServer,
LogDefs USING [TypescriptOn],
MFile USING [
Acquire, Error, Handle, InitializeFileSystem, ReadWrite, Release, SetLength],
SpecialMFile USING [RegisterWithSupervisor],
MScavenge USING [StartingScavenge],
PilotClient,
ProcessorFace USING [mp, SetMP],
Supervisor USING [CreateSubsystem, SubsystemHandle],
System USING [switches, UpDown],
TTY USING [Create, Destroy, GetDecimal, Handle, PutCR, PutString];
GVSwitches: MONITOR
IMPORTS
GVPServer, LogDefs, MFile, SpecialMFile, MScavenge, ProcessorFace, Supervisor,
System, TTY
EXPORTS Event, PilotClient =
BEGIN
swapping: PUBLIC Supervisor.SubsystemHandle;
Run: PUBLIC PROCEDURE = {};
InfiniteWait: ENTRY PROCEDURE =
BEGIN
forever: CONDITION;
endOfNever: BOOLEAN ← FALSE;
UNTIL endOfNever DO WAIT forever; ENDLOOP;
END;
MakeFile: PROC [name: LONG STRING, sizeInPages: CARDINAL ← 0] =
BEGIN -- if file already exists, nothing happens, else it's created.
create: BOOLEAN ← FALSE;
myfile: MFile.Handle;
myfile ← MFile.Acquire[
name, anchor, [], TRUE, sizeInPages, binary !
MFile.Error => IF code = noSuchFile THEN {create ← TRUE; CONTINUE}];
IF create THEN
BEGIN
sizeInBytes: LONG CARDINAL;
IF sizeInPages = 0 THEN -- ask for size
BEGIN
tty: TTY.Handle ← TTY.Create[];
TTY.PutString[
tty, "Creating Heap File, how many pages (multiple of 6)? "L];
sizeInPages ← TTY.GetDecimal[tty];
TTY.PutCR[tty];
TTY.Destroy[tty];
END;
sizeInBytes ← LONG[sizeInPages] * LONG[Environment.bytesPerPage];
myfile ← MFile.ReadWrite[name, [], binary, sizeInBytes];
MFile.SetLength[myfile, sizeInBytes];
END;
MFile.Release[myfile];
END;
StartTrap: PROCEDURE =
BEGIN
savedMP: CARDINAL ← LAST[CARDINAL];
{
ENABLE
MScavenge.StartingScavenge => {
-- start trap of FileSystem may raise this signal
savedMP ← ProcessorFace.mp; ProcessorFace.SetMP[9950]; RESUME };
swapping ← Supervisor.CreateSubsystem[];
MFile.InitializeFileSystem[];
-- according to Loretta, this call to Init. must be accomp. by this other
-- mysterious stuff. The signal MUST be caught, and not in the call itself.
SpecialMFile.RegisterWithSupervisor[]};
-- this must be done separately so that the testbed can run without Tajo's supervisor handles
IF savedMP # LAST[CARDINAL] THEN ProcessorFace.SetMP[savedMP];
IF System.switches['i] = down THEN
BEGIN
MakeFile["Heap.data"];
MakeFile["MBX.Mailboxes", 120];
-- ~67,584 bytes, the current size of Riesling's MBX.Mailboxes
END;
IF System.switches['s] = down THEN
BEGIN
LogDefs.TypescriptOn[];
-- can now use LogPrivateDefs.tty to write to screen.
START GVPServer; -- this will reboot server.
InfiniteWait[];
END;
END;
-- Mainline code
StartTrap[];
END.