DIRECTORY Commander, CommandTool, File, Graphics, GraphicsOps, PrincOpsUtils USING[ LongCopy ], Process USING[ Detach, Pause, SecondsToTicks ], Rope USING[ Concat, Equal, ROPE ], ViewerClasses, ViewerOps, VolumeFormat USING[ VAMObject ], VM, VMSideDoor USING[ vmPages ]; ShowVAM: CEDAR PROGRAM IMPORTS Commander, CommandTool, File, Graphics, GraphicsOps, PrincOpsUtils, Process, Rope, ViewerOps, VM, VMSideDoor = BEGIN MyData: TYPE = REF MyDataRec; MyDataRec: TYPE = RECORD[ volume: File.Volume, bitmap: GraphicsOps.BitmapRef _ NIL ]; myClass: ViewerClasses.ViewerClass = NEW[ViewerClasses.ViewerClassRec _ [ flavor: $ShowVAM, paint: MyPaint, init: MyInit, icon: tool ] ]; VMName: Rope.ROPE = "VM"; Style: TYPE = { VM, VAM }; MyInit: ViewerClasses.InitProc --[self: Viewer]-- = BEGIN data: MyData _ NARROW[self.data]; style: Style = IF Rope.Equal[self.name, VMName, FALSE] THEN VM ELSE VAM; width: CARDINAL = 512; size: INT = IF style = VM THEN VMSideDoor.vmPages ELSE MIN[ File.GetVolumePages[data.volume].size, LONG[815]*15*28]; data.bitmap _ GraphicsOps.NewBitmap[width, (size+width-1)/width]; ViewerOps.SetOpenHeight[self, data.bitmap.height+1]; TRUSTED{ Process.Detach[IF style = VM THEN FORK VMFiller[self] ELSE FORK VAMFiller[self]] }; END; MyPaint: ViewerClasses.PaintProc --[self: Viewer, context: Graphics.Context, whatChanged: REF ANY, clear: BOOL]-- = BEGIN data: MyData = NARROW[self.data]; Graphics.SetCP[context, self.cw/2 - data.bitmap.width/2, data.bitmap.height+1]; GraphicsOps.DrawBitmap[ self: context, bitmap: data.bitmap, w: data.bitmap.width, h: data.bitmap.height]; END; VMFiller: PROC[self: ViewerClasses.Viewer] = TRUSTED BEGIN data: MyData = NARROW[self.data]; size: INT = VMSideDoor.vmPages; UNTIL self.destroyed DO IF NOT self.iconic THEN BEGIN word: LONG POINTER TO PACKED ARRAY [0..16) OF BOOL _ LOOPHOLE[data.bitmap.base]; page: INT _ 0; WHILE page < size DO FOR i: CARDINAL IN [0..16) DO word[i] _ VM.State[page].dataState # none; page _ page+1; ENDLOOP; word _ LOOPHOLE[word+1]; ENDLOOP; ViewerOps.PaintViewer[self, client]; END; Process.Pause[Process.SecondsToTicks[5]]; ENDLOOP; END; VAMFiller: PROC[self: ViewerClasses.Viewer] = TRUSTED BEGIN data: MyData = NARROW[self.data]; vamFile: File.Handle = File.Open[data.volume, File.GetRoot[data.volume, VAM].fp]; filePages: INT = File.Info[vamFile].size; fileWords: INT = File.wordsPerPage * filePages; interval: VM.Interval = VM.Allocate[VM.PagesForWords[fileWords]]; buffer: LONG POINTER TO VolumeFormat.VAMObject = VM.AddressForPageNumber[interval.page]; UNTIL self.destroyed DO IF NOT self.iconic THEN BEGIN File.Read[file: vamFile, from: [0], to: buffer, nPages: filePages]; PrincOpsUtils.LongCopy[from: @buffer[0], to: LOOPHOLE[data.bitmap.base], nwords: data.bitmap.raster * data.bitmap.height]; ViewerOps.PaintViewer[self, client]; END; Process.Pause[Process.SecondsToTicks[5]]; ENDLOOP; VM.Free[interval]; END; ShowVAMProc: Commander.CommandProc = { argv: CommandTool.ArgumentVector; volume: File.Volume; volumeName: Rope.ROPE; argv _ CommandTool.Parse[cmd: cmd ! CommandTool.Failed => { msg _ errorMsg; CONTINUE; }]; IF argv = NIL THEN GOTO Failed; IF argv.argc = 1 THEN { volume _ File.SystemVolume[]; volumeName _ File.GetVolumeName[volume]; } ELSE { IF argv.argc # 2 THEN GOTO Usage; volume _ File.FindVolumeFromName[argv[1]]; volumeName _ argv[1]; }; IF volume = NIL THEN GOTO NoVolume; [] _ ViewerOps.CreateViewer[ flavor: myClass.flavor, info: [column: left, iconic: FALSE, data: NEW[MyDataRec _ [volume: volume]], name: Rope.Concat["VAM for ", volumeName ]] ]; EXITS Failed => RETURN[$Failure, msg]; Usage => RETURN[$Failure, " Usage: ShowVAM volumename\n"]; NoVolume => RETURN[$Failure, " No such volume\n"]; }; ShowVMProc: Commander.CommandProc = { [] _ ViewerOps.CreateViewer[ flavor: myClass.flavor, info: [column: left, iconic: FALSE, data: NEW[MyDataRec _ [volume: File.SystemVolume[]]], name: VMName ] ]; }; ViewerOps.RegisterViewerClass[flavor: myClass.flavor, class: myClass]; Commander.Register[key: "ShowVAM", proc: ShowVAMProc, doc: "Show a viewer with a bitmap of the VAM (volume allocation map) of the given logical volume ('Cedar' if omitted)"]; Commander.Register[key: "ShowVM", proc: ShowVMProc, doc: "Show a viewer with a bitmap of the VM (virtual memory)"]; END. 2ShowVAM.mesa Andrew Birrell November 18, 1983 2:11 pm Bob Hagmann January 21, 1985 9:05:22 am PST Note kludge to only display 15 surfaces of a T-315 [exec: ExecHandle, clientData: REF ANY _ NIL] RETURNS[ok: BOOLEAN _ TRUE] [exec: ExecHandle, clientData: REF ANY _ NIL] RETURNS[ok: BOOLEAN _ TRUE] Bob Hagmann 14-May-84 Kludged to truncate large VAM maps for t-315's changes to: MyInit Bob Hagmann January 21, 1985 8:53:18 am PST Modified to run under Commander changes to: DIRECTORY, ShowVAM, ShowVAMProc, ShowVMProc, ShowVAM, ShowVAMProc, ShowVMProc ʘšœ ™ Jšœ)™)J™+—J˜šÏk ˜ J˜ J˜ J˜J˜ J˜ Jšœœ ˜ Jšœœ"˜/Jšœœœ˜"J˜Jšœ ˜ Jšœ œ˜ Jšœ˜Jšœ œ ˜—J˜šœ œ˜Jšœ_œ˜v—J˜Jš˜˜Jšœœœ ˜J˜šœ œœ˜Jšœ˜Jšœ ˜#Jšœ˜—J˜šœ%œ!˜IJšœ˜J˜J˜ J˜—J˜Jšœ œ˜J˜Jšœœœœ˜J˜šœ˜JšÏcœ˜Jš˜Jšœœ ˜!Jš œœœœœœœ˜Hšœœ˜J™2—šœœœ ˜Jšœ˜Jšœœ)œ ˜B—JšœA˜AJ˜4šœ˜Jš œœ œœœœœ˜S—Jšœ˜—J˜šœ ˜ JšžPœ˜RJš˜Jšœœ ˜!JšœO˜Ošœ˜Jšœ˜Jšœ˜Jšœ-˜-—Jšœ˜—J˜šÏnœœ˜4Jš˜Jšœœ ˜!Jšœœ˜Jšœ˜šœœœ ˜šœ˜ Jšœœœœœœ œœœ˜PJšœœ˜Jšœ ˜šœœœœ˜šœ œ˜-J˜—Jšœ˜Jšœœ ˜—Jšœ˜Jšœ$˜$Jšœ˜—Jšœ)˜)—Jšœ˜Jšœ˜—J˜šŸ œœ˜5Jš˜Jšœœ ˜!JšœHœ˜QJšœ œ˜)Jšœ œ!˜/Jšœ œ œ œ˜Ašœœœœ˜0Jšœ%˜'—Jšœ˜šœœœ ˜šœ˜ JšœC˜Cšœ-œ˜HJšœ1˜1—Jšœ$˜$Jšœ˜—Jšœ)˜)—Jšœ˜Jšœ˜Jšœ˜—J˜J˜šÏb œ˜'JšœI™IJšœ!˜!Jšœ˜Jšœœ˜šœ!˜!Icode1šœ+œ˜8—Jšœœœœ˜šœœ˜Jšœ˜Jšœ(˜(J˜—šœœ˜Jšœœœ˜!Jšœ*˜*Jšœ˜J˜—Jšœ œœœ ˜#šœ˜Jšœ˜šœ˜Jšœœ˜Jšœœ˜(Jšœ+˜+Jšœ˜——š˜Kšœ œ˜ Kšœ œ-˜