-- Copyright (C) 1983 by Xerox Corporation. All rights reserved. -- DogWatcher.mesa, HGM, 5-Dec-83 20:48:40 -- Beware: Start this early, or you might not have time. DIRECTORY CmFile USING [Handle, TableError], Process USING [Detach, Pause, priorityBackground, SecondsToTicks, SetPriority, Ticks], Put USING [Text], StringLookUp USING [noMatch, TableDesc], String USING [AppendChar, AppendDecimal, AppendString], Token USING [Boolean, Decimal], Indirect USING [Close, NextValue, OpenSection], Watchdog USING [Activate, Deactivate, Reactivate]; DogWatcher: PROGRAM IMPORTS CmFile, Process, Put, String, Token, Indirect, Watchdog = BEGIN FindParameters: PROCEDURE = BEGIN cmFile: CmFile.Handle; Option: TYPE = MACHINE DEPENDENT{ activate(0), deactivate, poke, noMatch(StringLookUp.noMatch)}; DefinedOption: TYPE = Option [activate..poke]; CheckType: PROCEDURE [h: CmFile.Handle, table: StringLookUp.TableDesc] RETURNS [index: CARDINAL] = Indirect.NextValue; MyNextValue: PROCEDURE [ h: CmFile.Handle, table: LONG DESCRIPTOR FOR ARRAY DefinedOption OF LONG STRING] RETURNS [index: Option] = LOOPHOLE[CheckType]; optionTable: ARRAY DefinedOption OF LONG STRING ¬ [ activate: "Activate"L, deactivate: "Deactivate"L, poke: "Poke"L]; leasedLines: CARDINAL ¬ 0; cmFile ¬ Indirect.OpenSection["WatchdogTimer"L]; IF cmFile = NIL THEN BEGIN Message["Can't find [WatchdogTimer] section in Parameter file"L]; Watchdog.Deactivate[]; Message["Deactivating Watchdog timer"L]; RETURN; END; DO option: Option; option ¬ MyNextValue[cmFile, DESCRIPTOR[optionTable] ! CmFile.TableError => BEGIN IF name[0] # '; THEN Message["Unrecognized parameter: ", name]; RETRY; END]; SELECT option FROM noMatch => EXIT; activate => BEGIN IF Token.Boolean[cmFile] THEN BEGIN Message["(Re)Activating Watchdog timer for another 3 minutes"L]; Watchdog.Activate[3*60]; END ELSE Message["Didn't activate Watchdog timer"L]; END; deactivate => BEGIN IF Token.Boolean[cmFile] THEN BEGIN Message["Deactivating Watchdog timer"L]; Watchdog.Deactivate[]; END ELSE Message["Didn't deactivate Watchdog timer"L]; END; poke => BEGIN IF Token.Boolean[cmFile] THEN BEGIN howLong: CARDINAL ¬ Token.Decimal[cmFile]; howOften: CARDINAL ¬ Token.Decimal[cmFile]; MessagePoke["Poking Watchdog timer"L, howLong, howOften]; Process.Detach[FORK Poker[howLong: howLong, howOften: howOften]]; END ELSE Message["Won't Poke Watchdog timer"L]; END; ENDCASE => ERROR; ENDLOOP; Indirect.Close[cmFile]; END; Poker: PROCEDURE [howLong, howOften: CARDINAL] = BEGIN ticks: Process.Ticks = Process.SecondsToTicks[howOften]; Process.SetPriority[Process.priorityBackground]; DO Watchdog.Reactivate[howLong]; Process.Pause[ticks]; ENDLOOP; END; Message: PROCEDURE [one, two, three: LONG STRING ¬ NIL] = BEGIN text: STRING = [100]; String.AppendString[text, one]; IF two # NIL THEN String.AppendString[text, two]; IF three # NIL THEN String.AppendString[text, three]; String.AppendChar[text, '.]; String.AppendChar[text, '\n]; LogString[text]; END; MessagePoke: PROCEDURE [one: LONG STRING, howLong, howOften: CARDINAL] = BEGIN text: STRING = [100]; String.AppendString[text, "Poking Watchdog timer for another "L]; String.AppendDecimal[text, howLong]; String.AppendString[text, " seconds every "L]; String.AppendDecimal[text, howOften]; String.AppendString[text, " seconds.\n"L]; LogString[text]; END; LogString: PROCEDURE [text: LONG STRING] = BEGIN Put.Text[NIL, text]; END; FindParameters[]; END.