system/multiuser/1.7.5/src/system info

Raw file
Back to index

PACKET system info DEFINES                      (* Autor: J.Liedtke *)
                                                (* Stand: 10.09.84  *)
    task info ,
    task status ,
    storage info ,
    help :


LET supervisor mode = 0 ,
    simple mode     = 1 ,
    status mode     = 2 ,
    storage mode    = 3 ,

    ack             = 0 ,

    channel field  = 4 ,
    prio field     = 6 ,

    cr lf     = ""13""10"" , 
    cr        = ""13"" , 
    page      = ""1""4"" ,
    begin mark= ""15"" ,
    end mark  = ""14"" ,
    bell      = ""7"" ,
    esc       = ""27"" ;



TEXT VAR task name , record ;
DATASPACE VAR ds := nilspace ;


PROC task info :

  task info (simple mode)

ENDPROC task info ;

PROC task info (INT CONST mode) :

  open list file ;
  task info (mode, list file) ;
  show task info .

open list file :
  forget (ds) ;
  ds := nilspace ;
  FILE VAR list file := sequential file (output, ds) .

show task info :
  IF mode <> supervisor mode
    THEN show (list file)
    ELSE open editor (list file, FALSE) ;
         edit (groesster editor, "q", PROC (TEXT CONST) no orders)
  FI .

ENDPROC task info ;

PROC task info (INT CONST mode, FILE VAR list file) :

  access catalogue ;
  IF mode > simple mode
    THEN generate head
  FI ;
  list tree (list file, supervisor,0, mode) .

generate head :
  put (list file, date) ;
  put (list file, " ") ;
  put (list file, time of day) ;
  put (list file, "                          ") ;
  IF mode = storage mode
    THEN put (list file, "K     ")
  FI ;
  put (list file, " CPU    PRIO CHAN STATUS") ;
  line (list file) .

ENDPROC task info ;
 
PROC task info (INT CONST level, fremdstation): 
  IF fremdstation = station (myself) 
  THEN task info (level) 
  ELSE 
    disable stop;
    DATASPACE VAR x:= nilspace; 
    BOUND INT VAR l := x; l := level; 
    call (collector, 256+fremdstation, x, rtn); 
    INT VAR rtn; 
    IF rtn = ack 
      THEN FILE VAR ti:= sequential file (modify, x) ;
           show (ti) 
      ELSE forget (x) ;
           errorstop ("Station " + text (fremdstation) + " antwortet nicht")
    FI ;
    forget (x) 
  FI 
END PROC task info; 

PROC no orders (TEXT CONST ed kommando taste) :

  IF ed kommando taste = "q"
    THEN quit
    ELSE out (""7"")
  FI

ENDPROC no orders ;

PROC list tree (FILE VAR list file,
                TASK CONST first son, INT CONST depth, mode) :

  enable stop ;
  TASK VAR actual task := first son ;
  WHILE NOT is niltask (actual task) REP
    list actual task ;
    list tree (list file, son (actual task), depth+1, mode) ;
    actual task := brother (actual task)
  PER .

list actual task :
  record := "" ;
  generate layout and task name ;
  IF mode > simple mode
    THEN tab to info position ;
         show storage if wanted ;
         record CAT cpu time of (actual task) ;
         record CAT prio of actual task ;
         record CAT channel of actual task ;
         record CAT "   " ;
         record CAT status of (actual task)
   FI ;
   putline (list file, record) .

generate layout and task name :
  INT VAR i ;
  FOR i FROM 1 UPTO depth REP
    record CAT "    "
  PER ;
  task name := name (actual task) ;
  record CAT task name .

tab to info position :
  record := subtext (record, 1, 40) ;
  FOR i FROM LENGTH record + 1 UPTO 40 REP
    record CAT "."
  PER ;
  record CAT " " .

show storage if wanted :
  IF mode = storage mode
    THEN record CAT text (storage (actual task), 5) ;
         record CAT "  "
  FI .

prio of actual task :
  text (pcb (actual task, prio field),4) .

channel of actual task :
  INT CONST channel := pcb (actual task, channel field) ;
  IF channel = 0
    THEN "   -"
    ELSE text (channel,4)
  FI .

ENDPROC list tree ;

TEXT PROC cpu time of (TASK CONST actual task) :

  disable stop ;
  TEXT VAR result := subtext (time (clock (actual task), 12), 1, 10) ;
  IF is error
    THEN clear error ;
         result := 10 * "*"
  FI ;
  result

ENDPROC cpu time of ;

TEXT PROC status of (TASK CONST actual task) :

  SELECT status (actual task) OF
    CASE 0 :  "-busy-"
    CASE 1 :  "i/o"
    CASE 2 :  "wait"
    CASE 4 :  "busy-blocked"
    CASE 5 :  "i/o -blocked"
    CASE 6 :  "wait-blocked"
    OTHERWISE "--dead--"
  END SELECT .

ENDPROC status of ;

PROC task status :

  task status (myself)

ENDPROC task status ;

PROC task status (TEXT CONST task name) :

  task status (task (task name))

ENDPROC task status ;

PROC task status (TASK CONST actual task) :

  IF exists (actual task)
    THEN put status of task
    ELSE errorstop ("Task nicht vorhanden")
  FI .

put status of task :
  line ;
  put (date); put (time of day) ;
  put ("  TASK:") ;
  put (name (actual task)) ;
  line (2) ;
  put ("Speicher:"); put (storage (actual task)); putline ("K");
  put ("CPU-Zeit:"); put (cpu time of (actual task)) ; line;
  put ("Zustand :"); write (status of (actual task)); 
                     put (", (prio");
                     write (text (pcb (actual task, prio field)));
                     put ("), Kanal") ;
                     IF channel (actual task) = 0
                       THEN put ("-")
                       ELSE put (channel (actual task))
                     FI ;
                     line .

ENDPROC task status ;

PROC storage info :
 
  INT VAR size, used ;
  storage (size, used) ;
  out (""13""10"      ") ;
  put (used) ;
  put ("K von") ;
  put (size plus reserve) ;
  putline ("K sind belegt!") .
 
size plus reserve :
  int (real (size + 24) * 64.0 / 63.0 ) .

ENDPROC storage info ;
 
 
PROC help :

  IF NOT exists ("help")
    THEN get help file
  FI ;
  FILE VAR f := sequential file (modify, "help") ;
  help (f) .

get help file :
  TEXT VAR old std param := std ;
  IF exists ("help", father)
    THEN fetch ("help")
    ELSE fetch ("help", public)
  FI ;
  last param (old std param) .

ENDPROC help ;

PROC help (FILE VAR help file) :
 
  initialize help command ;
  REP 
    out (page) ;
    to paragraph ; 
    show paragraph ; 
    get show command 
  UNTIL is quit command PER .
 
initialize help command :
   TEXT VAR
   help command := getcharety ;
   IF help command = ""
     THEN help command := "0"
   FI .

to paragraph : 
  col (help file, 1) ;
  to line (help file, 1) ; 
  downety (help file, "#" + help command + "#") ; 
  IF eof (help file) 
    THEN to line (help file, 1) ;
         out (bell)
  FI . 
 
show paragraph : 
  show headline ;
  WHILE NOT end of help subfile REP 
    show help line
  PER ; 
  show bottom line .

show headline :
  out (begin mark) ;
  INT CONST dots := (x size - len (help file) - 5) DIV 2 ;
  dots TIMESOUT "." ;
  exec (PROC show line, help file, 4) ;
  dots TIMESOUT "." ;
  out (end mark) ;
  down (help file) .

show help line :
  out (cr lf) ;
  exec (PROC show line, help file, 1) ;
  down (help file) .

show bottom line :
  cursor (5, y size) ; 
  exec (PROC show line, help file, 3) ; 
  out (cr) . 
 
get show command : 
  TEXT VAR char ;
  get char (char) ;
  IF char = esc
    THEN get char (char)
  FI ;
  IF char >= " "
    THEN help command := char
    ELSE out (bell)
  FI .

end of help subfile : pos (help file,"##",1) <> 0 OR eof (help file) .

is quit command     : help command = "q" OR help command = "Q" .

ENDPROC help ;
 
PROC show line (TEXT CONST line, INT CONST from) : 
 
  outsubtext (line, from, x size - from) 
 
ENDPROC show line ;
 
ENDPACKET system info ;