<> <> <<>> DIRECTORY Atom USING [ GetProp, MakeAtom, PutProp ], Booting USING [ CallBootingProcs, Deregister, RegisterProcs, CheckpointProc ], Commander USING [ CommandProc, Register ], FinchSmarts USING [ PlayNoise ], Process USING [ Detach, MsecToTicks, Pause ], UserProfile USING [ Token ] ; PlayNoiseImpl: CEDAR PROGRAM IMPORTS Atom, Booting, Commander, FinchSmarts, Process, UserProfile = { reallyBoot: BOOL_TRUE; didOurBest: BOOL; maxTime: CARDINAL _ 4000; PlayTheRollbackButton: Booting.CheckpointProc = TRUSTED { PlayAButton[$rollback]; IF ~reallyBoot THEN rejection _ "Just pretending"; }; PlayAButton: PROC[name: ATOM] = TRUSTED { didOurBest _ FALSE; Process.Detach[FORK ReallyPlayAButton[name]]; FOR i: NAT IN [0..100) DO Process.Pause[Process.MsecToTicks[maxTime/100]]; IF didOurBest THEN EXIT; ENDLOOP; }; ReallyPlayAButton: PROC[name: ATOM] = { []_FinchSmarts.PlayNoise[noiseName: name, wait: TRUE]; didOurBest _ TRUE; }; Register: PROC [newPlayTheRollbackButton: Booting.CheckpointProc] ~ { vo: REF=Atom.GetProp[$Interfaces, $PlayTheRollback]; oldPlayTheRollbackButton: REF Booting.CheckpointProc _ NARROW[vo, REF Booting.CheckpointProc]; IF oldPlayTheRollbackButton # NIL THEN Booting.Deregister[c: oldPlayTheRollbackButton^, r: NIL, b: oldPlayTheRollbackButton^]; IF newPlayTheRollbackButton = NIL THEN RETURN; Booting.RegisterProcs[c: PlayTheRollbackButton, r: NIL, b: PlayTheRollbackButton]; Atom.PutProp[$Interfaces, $PlayTheRollback, NEW[Booting.CheckpointProc_PlayTheRollbackButton]]; }; DoNoisyBoot: Commander.CommandProc = { Register[PlayTheRollbackButton]; }; NoNoisyBoot: Commander.CommandProc = { Register[NIL]; }; TestNoisyBoot: Commander.CommandProc = { []_Booting.CallBootingProcs[]; }; IF Atom.MakeAtom[UserProfile.Token["Finch.NoisyBoot", "FALSE"]] = $TRUE THEN Register[PlayTheRollbackButton]; Commander.Register["NoisyBoot", DoNoisyBoot, "Pleasant surprise on rollback or boot"]; Commander.Register["TestNoisyBoot", TestNoisyBoot]; Commander.Register["NoNoisyBoot", NoNoisyBoot, "No pleasant surprise on rollback or boot"]; }.