PACKET xlist DEFINES xlist : (* M. Staubermann, 1.8.0 861203 *)
(* Heapsize korrigiert 870711 *)
DATASPACE VAR ds, act ;
PROC x list :
ds := nilspace ;
FILE VAR f := sequentialfile (output, ds) ;
headline (f, "Dataspaces:" + text (dataspaces) +
" Speicher:" + text (storage (myself))) ;
disablestop ;
xlist (f) ;
show (f) ;
forget (ds) ;
ENDPROC x list ;
PROC x list (FILE VAR f) :
INT VAR i, acttype, heapsiz, seiten ;
TEXT VAR name, status ;
FILE VAR f2 ;
ROW 255 STRUCT (TEXT name, status) VAR names ;
enablestop ;
FOR i FROM 1 UPTO 255 REP
names (i).name := "" ;
names (i).status := ""
PER ;
begin list ;
get list entry (name, status) ;
WHILE name <> "" REP
makeid (old (name)) ;
names (dsnr).name := name ;
names (dsnr).status := status ;
get list entry (name, status)
PER ;
maxlinelength (f, 1000) ;
putline (f, "Datum Status Ds kB Type HeapLines Segs S/L ""Name""/'Headline'");
line (f) ;
putline (f, " 4 " + text ((pages (4, myself)+1) DIV 2, 5) +
" " + text (heapsize, 3) + " - - -") ;
disablestop ;
FOR i FROM 5 UPTO 255 REP
cout (i) ;
makeid (i) ;
act := reveal ds ;
IF iserror
THEN clearerror
ELSE name := names (i).name ;
status := names (i).status ;
acttype := type (act) ;
names (i).name := "" ;
names (i).status := "" ;
put (f, stat + id + " " + speicher + " " + typ + " " + heap) ;
putline (f, zeilen + " " + segmente + " " + sl percent + dsname) ;
FI ;
forget (act) ;
IF iserror THEN puterror ; clearerror FI
PER .
dsname :
IF name = ""
THEN IF act type = 1003
THEN " '" + headline (f2) + "'"
ELSE ""
FI
ELSE " """ + name + """"
FI .
stat :
IF status = ""
THEN " "
ELSE status
FI .
typ:
text (act type, 5) .
id :
text (i, 3) .
speicher :
seiten := ds pages (act) ;
text ((seiten+1) DIV 2, 5) .
zeilen :
IF act type <> 1003 THEN " -"
ELSE f2 := sequentialfile (modify, act) ;
text (lines (f2), 4)
FI .
segmente :
IF act type <> 1003 THEN " -"
ELSE INT CONST segs :: segments (f2) ;
text (segs, 4)
FI .
sl percent:
IF act type <> 1003 THEN " - "
ELIF segs = 1 THEN " "
ELSE text (int (real (segs) * 100.0 / real (lines (f2))+0.5), 2) + "%"
FI .
heap :
heapsiz:= heapsize (act) * 2 ;
IF heapsiz >= 2046
THEN " -"
ELIF act type = 1003
THEN IF heapsiz < 192
THEN " 0"
ELSE text ((heapsiz-192) DIV 2, 4)
FI
ELSE INT CONST next page :: next ds page (act, seiten) ;
IF next page < 0
THEN " 0"
ELIF heapsiz = next page
THEN " 1"
ELSE text ((heapsiz + 1 - next page) DIV 2, 4)
FI
FI .
ENDPROC x list ;
PROC make id (DATASPACE CONST ds) :
BOUND INT VAR i := ds
ENDPROC make id ;
INT PROC dsnr :
INT VAR id ;
id AND 255
ENDPROC dsnr ;
PROC makeid (INT CONST nr) :
INT VAR dsid := nr + 256 * index (myself)
ENDPROC makeid ;
DATASPACE PROC reveal ds :
DATASPACE VAR ds ; ds
ENDPROC reveal ds ;
INT PROC pages (INT CONST dsnr, TASK CONST task) :
EXTERNAL 88
ENDPROC pages ;
ENDPACKET x list ;