--ILTScavengeImpl.mesa
--Created by
-- JFung.PASA 29-Sep-83 16:16:16
-- Modified version from VolumeInitImplA.mesa
--last edited by
-- JFung.PASA 19-Dec-83 16:56:57
DIRECTORY
Cursor USING [Set],
Environment,
File,
Format,
LispToolOps USING [Data, DataHandle, toolData, GetVolumeID],
OthelloDefs,
OthelloOps,
PhysicalVolume,
Process,
Put,
Scavenger,
Space,
Transaction,
Volume;
ILTScavengeImpl: PROGRAM
IMPORTS Cursor, File, LispToolOps, Process, Put,
Scavenger, Space, Transaction, Volume
EXPORTS LispToolOps
SHARES File =
BEGIN OPEN ILT: LispToolOps, OthelloDefs, OthelloOps;
debug: BOOLEAN ← FALSE;
scavLogSp: Space.Handle = Space.Create[1, Space.virtualMemory];
ScavengeProc: PUBLIC PROCEDURE [vName: LONG STRING] =
BEGIN
logFile: File.Capability;
logPage: File.PageNumber ← 0;
logWd: CARDINAL ← Environment.wordsPerPage;
volumeID: Volume.ID ← Volume.nullID;
volumeOpen: BOOLEAN ← FALSE;
GetWds: PROC [p: POINTER, c: CARDINAL] =
BEGIN
IF debug THEN {
Put.Line[ILT.toolData.fileSW, "Enter GetWds..."L];
--Process.Pause[Process.SecondsToTicks[5]];
};
WHILE c # 0 DO
IF logWd = Environment.wordsPerPage THEN
BEGIN
IF logPage # 0 THEN { --Put.Line[ILT.toolData.fileSW, "Space.Unmap..."L];
--Process.Pause[Process.SecondsToTicks[5]];
Space.Unmap[scavLogSp]; };
--Put.Line[ILT.toolData.fileSW, "Space.Map..."L];
--Process.Pause[Process.SecondsToTicks[5]];
Space.Map[scavLogSp, [logFile, logPage]];
logPage ← logPage + 1;
logWd ← 0;
END;
p↑ ← (Space.LongPointer[scavLogSp] + logWd)↑;
p ← p + 1;
c ← c - 1;
logWd ← logWd + 1;
ENDLOOP;
END; -- GetWds
DisplayScavLog: PROC =
BEGIN
fileCount: LONG CARDINAL;
problems: BOOLEAN ← FALSE;
--BEGIN
hd: Scavenger.Header;
GetWds[@hd, SIZE[Scavenger.Header]];
Put.Text[ILT.toolData.fileSW, " volume"L];
IF ~hd.repaired THEN Put.Text[ILT.toolData.fileSW, " not"L];
Put.Text[ILT.toolData.fileSW, " repaired, log file"L];
IF hd.incomplete THEN Put.Text[ILT.toolData.fileSW, " not"L];
Put.Line[ILT.toolData.fileSW, " complete "L];
fileCount ← hd.numberOfFiles;
Put.Text[ILT.toolData.fileSW, " "L];
Put.LongNumber[
ILT.toolData.fileSW, fileCount, Format.DecimalFormat];
Put.Line[ILT.toolData.fileSW, " files on volume"L];
--END;
WHILE fileCount # 0 DO
OpenID: TYPE = ARRAY [0..SIZE[File.ID]) OF CARDINAL;
fe: Scavenger.FileEntry;
GetWds[@fe, SIZE[Scavenger.FileEntry]];
THROUGH [0..fe.numberOfProblems) DO
fp: Scavenger.Problem;
GetWds[@fp, SIZE[Scavenger.Problem]];
Put.Char[ILT.toolData.fileSW, '[];
Process.Pause[Process.SecondsToTicks[5]];
FOR i: CARDINAL IN [0..SIZE[File.ID] - 1) DO
Put.Octal[
ILT.toolData.fileSW, LOOPHOLE[fe.file, OpenID][
i]];
Put.Text[ILT.toolData.fileSW, ", "L];
ENDLOOP;
Put.Octal[
ILT.toolData.fileSW, LOOPHOLE[fe.file, OpenID][
SIZE[File.ID] - 1]];
Put.Text[ILT.toolData.fileSW, "] type = "L];
BEGIN
ENABLE File.Unknown => GOTO noType;
f: File.Type = File.GetAttributes[
[fe.file, File.read]].type;
Put.LongDecimal[
ILT.toolData.fileSW, LONG[LOOPHOLE[f, CARDINAL]]];
EXITS noType => Put.Text[ILT.toolData.fileSW, "unknown"L];
END;
Put.Text[ILT.toolData.fileSW, "; "L];
WITH fp SELECT FROM
unreadable =>
BEGIN
Put.Text[
ILT.toolData.fileSW,
"unreadable pages ["L];
Put.LongDecimal[ILT.toolData.fileSW, first];
Put.Text[ILT.toolData.fileSW, ".."L];
Put.LongDecimal[
ILT.toolData.fileSW, first + count];
Put.Line[ILT.toolData.fileSW, ")"L];
END;
missing =>
BEGIN
Put.Text[
ILT.toolData.fileSW, "missing pages ["L];
Put.LongDecimal[ILT.toolData.fileSW, first];
Put.Text[ILT.toolData.fileSW, ".."L];
Put.LongDecimal[
ILT.toolData.fileSW, first + count];
Put.Line[ILT.toolData.fileSW, ")"L];
END;
duplicate =>
Put.Line[
ILT.toolData.fileSW,
"duplicate page found"L];
orphan =>
Put.Line[
ILT.toolData.fileSW, "orphan page found"L];
ENDCASE =>
Put.Line[
ILT.toolData.fileSW, "unknown problem"L];
IF debug THEN
Process.Pause[Process.SecondsToTicks[5]];
problems ← TRUE;
ENDLOOP;
fileCount ← fileCount - 1;
ENDLOOP;
IF ~problems THEN
Put.Line[ILT.toolData.fileSW, " No problems found"L];
IF debug THEN Process.Pause[Process.SecondsToTicks[5]];
END; --DisplayScavLog
IF debug THEN {
Put.Line[ILT.toolData.fileSW, "Enter ScavengeProc..."L];
Process.Pause[Process.SecondsToTicks[5]];
Put.LongString[ILT.toolData.fileSW, vName];
Put.CR[ILT.toolData.fileSW];
};
[volumeID, volumeOpen] ← ILT.GetVolumeID[vName];
IF ~volumeOpen THEN RETURN;
Put.Text[ILT.toolData.fileSW, " Scavenging..."L];
--Cursor.Set[hourGlass];
IF debug THEN {
Put.Line[ILT.toolData.fileSW, "Volume.Close..."L];
--Process.Pause[Process.SecondsToTicks[5]];
};
Volume.Close[volumeID ! ANY => CONTINUE];
IF debug THEN {
Put.Line[ILT.toolData.fileSW, "LimitPermissions..."L];
--Process.Pause[Process.SecondsToTicks[5]];
};
logFile ← File.LimitPermissions[
Scavenger.Scavenge[volumeID, volumeID, TRUE], File.read];
Put.Line[ILT.toolData.fileSW, "Done"L];
--Cursor.Set[textPointer];
IF debug THEN {
Put.Line[ILT.toolData.fileSW, "Volume.Open..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
Volume.Open[volumeID];
IF debug THEN {
Put.Line[ILT.toolData.fileSW, "DisplayScavLog..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
DisplayScavLog[
! UNWIND => {Space.Unmap[scavLogSp]; Volume.Close[volumeID]}];
-- DisplayScavLog[];
IF debug THEN {
Put.Line[ILT.toolData.fileSW, "Unmap..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
Space.Unmap[scavLogSp];
IF debug THEN {
Put.Line[ILT.toolData.fileSW, "Volume.Close..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
Volume.Close[volumeID];
END; --ScavengeProc
END.....