(FILECREATED " 1-Aug-85 16:31:24" {ERIS}<LISPCORE>SOURCES>AINTERRUPT.;27 26227  

      changes to:  (FNS INTCHAR GETINTERRUPT SETINTERRUPT CONTROL-T \CONTROL-T.PRINTRATIO)
		   (MACROS \SYSTEMINTERRUPTP)
		   (VARS AINTERRUPTCOMS \SYSTEMINTERRUPTS)

      previous date: "18-Jul-85 13:02:18" {ERIS}<LISPCORE>SOURCES>AINTERRUPT.;24)


(* Copyright (c) 1982, 1983, 1984, 1985 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT AINTERRUPTCOMS)

(RPAQQ AINTERRUPTCOMS ((COMS (* handling interrupts)
			     (FNS INTCHAR INTERRUPTCHAR INTERRUPTED LISPINTERRUPTS \DOHELPINTERRUPT 
				  \DOHELPINTERRUPT1 \DOINTERRUPTHERE \DOSTACKFULLINTERRUPT 
				  \PROC.FINDREALFRAME \SETPRINTLEVEL \SETRECLAIMMIN GETINTERRUPT 
				  CURRENTINTERRUPTS SETINTERRUPT RESET.INTERRUPTS INTERRUPTABLE))
	(COMS (* ↑T)
	      (FNS CONTROL-T \CONTROL-T.PRINTRATIO)
	      (INITVARS (\CONTROL-T.DEPTH 3)
			(\CONTROL-T.BACKSLASH)
			(LAST↑TTIMEBOX (CLOCK 0))
			(LAST↑TSWAPTIME)
			(LAST↑TDISKIOTIME 0)
			(LAST↑TGCTIME 0)
			(LAST↑TNETIOTIME 0))
	      (GLOBALVARS \CONTROL-T.DEPTH \CONTROL-T.BACKSLASH LAST↑TTIMEBOX LAST↑TSWAPTIME 
			  LAST↑TDISKIOTIME LAST↑TNETIOTIME LAST↑TGCTIME \MISCSTATS)
	      (ADDVARS (\SYSTEMCACHEVARS LAST↑TSWAPTIME)))
	[INITVARS (\CURRENTINTERRUPTS)
		  (\INTERRUPTABLE)
		  (INTERRUPTMENUFONT (QUOTE (GACHA 10]
	(VARS \SYSTEMINTERRUPTS)
	(DECLARE: EVAL@COMPILE DONTCOPY (ADDVARS (NOFIXFNSLST CONTROL-T))
		  (LOCALVARS . T)
		  (GLOBALVARS \CURRENTINTERRUPTS \SYSTEMINTERRUPTS INTERRUPTMENUFONT))
	(DECLARE: EVAL@COMPILE (EXPORT (ADDVARS (SYSSPECVARS \INTERRUPTABLE))
				       (PROP INFO UNINTERRUPTABLY)
				       (PROP DMACRO UNINTERRUPTABLY)
				       (ALISTS (PRETTYPRINTMACROS UNINTERRUPTABLY)))
		  DONTCOPY
		  (EXPORT (RECORDS INTERRUPTSTATE)
			  (PROP DMACRO \TAKEINTERRUPT))
		  (MACROS \SYSTEMINTERRUPTP))))



(* handling interrupts)

(DEFINEQ

(INTCHAR
  [LAMBDA (CHAR TYP/FORM HARDFLG TABLE)                      (* bvm: " 1-Aug-85 16:03")
                                                             (* this function is the non-undoable version of 
							     INTERRUPTCHAR; INTERRUPTCHAR calls it)
    (PROG (VAL SYSDEF OLDINT)
          (SELECTQ CHAR
		   (NIL                                      (* this is illegal, so don't do anything about it)
			(RETURN))
		   (T                                        (* (INTCHAR T) means restore interrupts to the 
"standard" setting)
		      (UNINTERRUPTABLY
                          (for CHAR in (GETINTERRUPT NIL TABLE)
			     do (SETQ VAL (NCONC (INTCHAR CHAR NIL NIL TABLE)
						 VAL)))      (* turn off all user interrupts -
							     (GETINTERRUPT) returns list of user interrupts)
			  [MAPC (LISPINTERRUPTS)
				(FUNCTION (LAMBDA (LST)
				    (SETQ VAL (NCONC (INTCHAR (CAR LST)
							      (CADR LST)
							      (CADDR LST)
							      TABLE)
						     VAL]    (* and reset all SYSTEM interrupts to default -
							     (LISPINTERRUPTS) returns a list of argument lists for 
							     INTCHAR)
                                                             (* and VAL has been set to a valid arg list for 
							     INTCHAR)
			  (RETURN VAL)))
		   NIL)
          (COND
	    ((LISTP CHAR)                                    (* Call from undoing or resetform.
							     CHAR is a list of characters followed by typ/form 
							     arguments.)
	      (while CHAR do (SETQ VAL (NCONC (INTCHAR (pop CHAR)
						       (pop CHAR)
						       (pop CHAR)
						       TABLE)
					      VAL)))
	      (RETURN VAL)))
          [COND
	    ((NOT (FIXP CHAR))
	      (COND
		[(\SYSTEMINTERRUPTP CHAR)

          (* CHAR can be an interrupt character class, meaning the character which is currently assigned to that interrupt -
	  this is most useful in, say, (INTCHAR (QUOTE HELP)) which says turn off the character whose class is HELP)


		  (SETQ CHAR (OR (GETINTERRUPT CHAR TABLE)
				 (ERRORX (LIST 27 CHAR]
		(T                                           (* turn single character into character code)
		   (SETQ CHAR (APPLY* (QUOTE CHARCODE)
				      CHAR]
          [SETQ VAL (AND (SETQ OLDINT (GETINTERRUPT CHAR TABLE))
			 (LIST CHAR (CAR OLDINT)
			       (CADR OLDINT]
          [COND
	    ((EQ TYP/FORM T)                                 (* just return value indicating what it was.)
	      (RETURN VAL))
	    ((AND TYP/FORM (LITATOM TYP/FORM)
		  (SETQ SYSDEF (ASSOC TYP/FORM \SYSTEMINTERRUPTS)))
                                                             (* System interrupt -- get its default HARDFLG)
	      (OR HARDFLG (SETQ HARDFLG (CADR SYSDEF]
          (COND
	    ((AND (EQ (CAR OLDINT)
		      TYP/FORM)
		  (EQ (CADR OLDINT)
		      HARDFLG))                              (* if the character is already set up, just return)
	      (RETURN)))
          (COND
	    (OLDINT (SETINTERRUPT CHAR NIL TABLE)))
          (COND
	    ((NULL TYP/FORM)                                 (* just leave character disabled)
	      )
	    (T                                               (* make a user interrupt)
	       (COND
		 ((AND SYSDEF (SETQ OLDINT (GETINTERRUPT TYP/FORM TABLE)))
                                                             (* if a system interrupt and there is another character
							     assigned to that channel, turn that character off)
		   (SETINTERRUPT OLDINT NIL TABLE)
		   (push VAL OLDINT TYP/FORM NIL)))
	       (SETINTERRUPT CHAR TYP/FORM TABLE HARDFLG)
	       (push VAL CHAR NIL NIL)))
          (RETURN VAL])

(INTERRUPTCHAR
  [LAMBDA (CHAR TYP/FORM HARDFLG TABLE)                      (* lmm "14-May-85 16:56")
    (PROG ((VAL (INTCHAR CHAR TYP/FORM HARDFLG TABLE)))
          (AND LISPXHIST (UNDOSAVE (LIST (QUOTE INTERRUPTCHAR)
					 VAL NIL NIL TABLE)))
          (RETURN VAL])

(INTERRUPTED
  [LAMBDA NIL                                                (* bvm: "18-Jul-85 12:34")
    (DECLARE (GLOBALVARS \INTERRUPTSTATE)
	     (USEDFREE \MOUSEBUSY \INTERRUPTABLE))
    (COND
      ((NULL \INTERRUPTABLE)
	(SETQ \PENDINGINTERRUPT T))
      ((fetch STORAGEFULL of \INTERRUPTSTATE)
	(\DOSTORAGEFULLINTERRUPT))
      ((fetch STACKOVERFLOW of \INTERRUPTSTATE)
	(\DOSTACKFULLINTERRUPT))
      ((fetch VMEMFULL of \INTERRUPTSTATE)
	(\DOVMEMFULLINTERRUPT))
      (T (LET* [(CH (fetch INTCHARCODE of \INTERRUPTSTATE))
		(INTERRUPT (CDR (ASSOC CH (fetch (KEYACTION INTERRUPTLIST) of \CURRENTKEYACTION]
	       (COND
		 (INTERRUPT (LET* [(CLASS (CAR INTERRUPT))
				   (HARDFLG (CADR INTERRUPT))
				   (THISPROC (THIS.PROCESS))
				   (INTERRUPTED.PROC (COND
						       ((OR (NULL THISPROC)
							    (EQ HARDFLG T))
							 THISPROC)
						       [(EQ HARDFLG (QUOTE MOUSE))
							 (LET ((MP THISPROC))
                                                             (* Interrupt MOUSE proc if it's busy, else the tty 
							     process)
							      (COND
								([COND
								    ((EQ (PROCESSPROP MP
										      (QUOTE NAME))
									 (QUOTE MOUSE))
								      \MOUSEBUSY)
								    ((SETQ MP (FIND.PROCESS
									  (QUOTE MOUSE)))
								      (PROCESS.EVALV MP (QUOTE 
										       \MOUSEBUSY]
								  MP)
								(T (TTY.PROCESS]
						       [(EQ HARDFLG (QUOTE WHICHW))
                                                             (* Interrupt the process that owns the window the mouse
							     is in)
							 (AND (GETD (QUOTE WHICHW))
							      (LET ((W (WHICHW)))
							           (AND W (WINDOWPROP W (QUOTE 
											  PROCESS]
						       (T (TTY.PROCESS]
			          (COND
				    ((EQ THISPROC INTERRUPTED.PROC)
				      (\DOINTERRUPTHERE CLASS))
				    ((NULL INTERRUPTED.PROC)
                                                             (* Nobody qualified, so dismiss interrupt)
				      NIL)
				    ((\PROCESS.MAKEFRAME INTERRUPTED.PROC (FUNCTION \DOINTERRUPTHERE)
							 (LIST CLASS CH HARDFLG)))
				    (T                       (* Couldn't build frame, so leave interrupt pending)
				       (SETQ \PENDINGINTERRUPT T])

(LISPINTERRUPTS
  [LAMBDA NIL                                                (* lmm " 1-Jul-85 20:19")
    (QUOTE ((2 BREAK MOUSE)
	     (4 RESET MOUSE)
	     (5 ERROR MOUSE)
	     (8 HELP T)
	     (16 PRINTLEVEL)
	     (20 (CONTROL-T))
	     (127 RUBOUT T])

(\DOHELPINTERRUPT
  [LAMBDA NIL                                                (* bvm: "27-JUL-83 18:37")
    (PROG (PROC)
          (COND
	    ((NULL (THIS.PROCESS))
	      (FLASHWINDOW)
	      (\DOHELPINTERRUPT1))
	    ([NULL (SETQ PROC (PROGN (FLASHWINDOW)
				     (\SELECTPROCESS "Interrupt which process?"]
                                                             (* Interrupt declined)
	      NIL)
	    ((EQ PROC (THIS.PROCESS))
	      (\DOHELPINTERRUPT1))
	    ((\PROCESS.MAKEFRAME PROC (FUNCTION \DOHELPINTERRUPT1)))
	    (T                                               (* Couldn't build frame, so leave interrupt pending)
	       (SETQ \PENDINGINTERRUPT T])

(\DOHELPINTERRUPT1
  [LAMBDA NIL                                                (* bvm: "11-AUG-83 11:56")

          (* Does HELP/BREAK interrupt in the current process. We treat ↑B same as ↑H, except that former always occurs in 
	  tty process. BREAK interrupt used to just do a (ERRORX (LIST 22Q NIL)) instead of calling INTERRUPT)


    (COND
      ((NULL \INTERRUPTABLE)                                 (* Unlikely, but could occur if someone blocked while 
							     uninterruptable)
	(FLASHWINDOW))
      (T (PROG (OLDTTY)
	       [OR (TTY.PROCESSP)
		   (SETQ OLDTTY (TTY.PROCESS (THIS.PROCESS]
	       [COND
		 ((EQ (fetch PROCNAME of (THIS.PROCESS))
		      (QUOTE MOUSE))
		   (SPAWN.MOUSE (THIS.PROCESS]
	       (CLEARBUF T T)                                (* Find name of a real frame before INTERRUPTED, so 
							     break message can be nice.)
	       (INTERRUPT (\PROC.FINDREALFRAME)
			  NIL 2)
	       (COND
		 (OLDTTY (TTY.PROCESS OLDTTY])

(\DOINTERRUPTHERE
  [LAMBDA (CLASS)
    (DECLARE (USEDFREE \INTERRUPTABLE))                      (* bvm: "18-Jul-85 12:37")

          (* * Perform the CLASS interrupt in the currently running process)


    (COND
      ((NOT \INTERRUPTABLE)
	(SETQ \PENDINGINTERRUPT T))
      (T (SELECTQ CLASS
		  (RESET (\CLEARSYSBUF T)
			 (RESET))
		  (ERROR (\CLEARSYSBUF T)
			 (SETERRORN 47)
			 (ERROR!))
		  (HELP                                      (* Does a ↑B in process selected by user)
			(\DOHELPINTERRUPT))
		  (BREAK (\DOHELPINTERRUPT1))
		  (CONTROL-T (CONTROL-T))
		  (STORAGE (\SETRECLAIMMIN))
		  (PRINTLEVEL (\SETPRINTLEVEL))
		  (RUBOUT (FLASHWINDOW)
			  (\CLEARSYSBUF T))
		  (RAID (RAID))
		  (COND
		    ((LITATOM CLASS)
		      (SET CLASS T))
		    (T (\EVAL CLASS])

(\DOSTACKFULLINTERRUPT
  [LAMBDA NIL                                                (* bvm: "20-Apr-84 17:38")
    (replace STACKOVERFLOW of \INTERRUPTSTATE with NIL)
    (PROG ((HELPFLAG (QUOTE BREAK!)))
          (LISPERROR "STACK OVERFLOW" NIL T])

(\PROC.FINDREALFRAME
  [LAMBDA (POS)                                              (* bvm: "18-Jul-85 13:00")
                                                             (* Returns the name of the first interesting frame 
							     before POS, or the caller if POS = NIL)
    (for I from (COND
		  (POS 0)
		  (T -2))
       by -1 do (SELECTQ (SETQ $$VAL (STKNTHNAME I POS))
			 ((INTERRUPTED \INTERRUPTFRAME \INTERRUPTED \DOHELPINTERRUPT 
				       \DOHELPINTERRUPT1 \DOBUFFEREDTRANSITIONS \DOINTERRUPTHERE 
				       \PROCESS.GO.TO.SLEEP BLOCK AWAIT.EVENT MONITOR.AWAIT.EVENT 
				       GETMOUSESTATE)
			   NIL)
			 (RETURN $$VAL])

(\SETPRINTLEVEL
  [LAMBDA NIL                                                (* rrb "22-JUL-83 10:19")
    (DECLARE (GLOBALVARS \TCARPRINTLEVEL \TCDRPRINTLEVEL))
    (PROG (BUF OLB OSB CARN)
          (\BOUT \TERM.OFD (CHARCODE BELL))
          (SETQ OLB (LINBUF T))
          (SETQ OSB (SYSBUF T))
          (CLEARBUF T T)
          (DSPSOUT "set printlevel to: ")
          (PROG ((N 0)
		 CH)
	    LP  (SELCHARQ (SETQ CH (\GETCHAR))
			  ((0 1 2 3 4 5 6 7 8 9)
			    [SETQ N (IPLUS (ITIMES N 10)
					   (IDIFFERENCE CH (CHARCODE 0]
			    (GO LP))
			  [(%. !)                            (* CARN is set if we've already seen a comma)
			    (COND
			      (CARN (SETQ \TCARPRINTLEVEL CARN)
				    (SETQ \TCDRPRINTLEVEL N))
			      (T (SETQ \TCARPRINTLEVEL N)))
			    (COND
			      ((EQ CH (CHARCODE !))          (* Make it permanent)
				(PRINTLEVEL \TCARPRINTLEVEL \TCDRPRINTLEVEL]
			  [, (COND
			       ((NOT CARN)
				 (SETQ CARN N)               (* This is the first comma)
				 (SETQ N 0)
				 (GO LP]
			  NIL)                               (* Restore buffers cleared with CLEARBUF)
	    )
          (COND
	    ((SETQ BUF (SYSBUF T))
	      (BKSYSBUF BUF)))
          (SETQ \SYSBUF OSB)
          (AND (SETQ BUF (LINBUF T))
	       (LINBUF))
          (SETQ \LINBUF OLB])

(\SETRECLAIMMIN
  [LAMBDA NIL                                                (* rrb "22-JUL-83 10:19")
    (PROG (BUF OLB OSB CH)
          (\BOUT \TERM.OFD (CHARCODE BELL))
          (SETQ OLB (LINBUF T))
          (SETQ OSB (SYSBUF T))
          (CLEARBUF T T)
          (DSPSOUT "set RECLAIMMIN to: ")
          (PROG ((N 0))
	    LP  (SELCHARQ (SETQ CH (\GETCHAR))
			  ((0 1 2 3 4 5 6 7 8 9)
			    [SETQ N (IPLUS (ITIMES N 10)
					   (IDIFFERENCE CH (CHARCODE 0]
			    (GO LP))
			  (%. (RECLAIMMIN N))
			  NIL))
          (COND
	    ((SETQ BUF (SYSBUF T))
	      (BKSYSBUF BUF)))
          (SETQ \SYSBUF OSB)
          (AND (SETQ BUF (LINBUF T))
	       (LINBUF))
          (SETQ \LINBUF OLB])

(GETINTERRUPT
  [LAMBDA (CHAR TABLE)                                       (* bvm: " 1-Aug-85 15:55")
    (OR TABLE (SETQ TABLE \CURRENTKEYACTION))
    (SELECTQ CHAR
	     (NIL                                            (* Non-system interrupts)
		  (for X in (fetch (KEYACTION INTERRUPTLIST)
				   TABLE)
		     unless (\SYSTEMINTERRUPTP (CADR X)) collect (CAR X)))
	     (T                                              (* All system interrupts)
		(for X in (fetch (KEYACTION INTERRUPTLIST)
				 TABLE)
		   collect (CAR X)))
	     (COND
	       [(NUMBERP CHAR)
		 (CDR (FASSOC CHAR (fetch (KEYACTION INTERRUPTLIST)
					  TABLE]
	       (T (for X in (fetch (KEYACTION INTERRUPTLIST)
				   TABLE)
		     when (EQ CHAR (CADR X))
		     do                                      (* Find CHAR in system class.)
			(RETURN (CAR X])

(CURRENTINTERRUPTS
  [LAMBDA (TABLE)                                            (* bvm: "18-Jul-85 12:37")
    (APPEND (fetch (KEYACTION INTERRUPTLIST) of (OR TABLE \CURRENTKEYACTION])

(SETINTERRUPT
  [LAMBDA (CHAR CLASS TABLE HARDFLG)                         (* bvm: " 1-Aug-85 16:09")
    (OR TABLE (SETQ TABLE \CURRENTKEYACTION))
    (LET (TEM)                                               (* This code assumes that the variable 
							     (FETCH (KEYACTION INTERRUPTLIST) TABLE) is an alist of 
							     the form ((CHAR CLASS) ...))
         (COND
	   ((NULL CHAR)                                      (* some mistake)
	     NIL)
	   ((\SYSTEMINTERRUPTP CHAR)                         (* If this is a system interrupt, then this is turning 
							     it off)
	     (SETINTERRUPT (GETINTERRUPT CHAR TABLE)
			   NIL TABLE))
	   [(SETQ TEM (FASSOC CHAR (fetch (KEYACTION INTERRUPTLIST)
					  TABLE)))           (* CHAR is currently an interrupt)
	     (COND
	       ((AND (EQ (CADR TEM)
			 CLASS)
		     (EQ (CADDR TEM)
			 HARDFLG))                           (* No change)
		 )
	       ((NULL CLASS)                                 (* REMOVE FROM INTERRUPT CHARACTER SET)
		 (change (fetch (KEYACTION INTERRUPTLIST)
				TABLE)
			 (DREMOVE TEM DATUM)))
	       (T                                            (* Assign new interrupt to CHAR)
		  (change (CDR TEM)
			  (LIST CLASS HARDFLG]
	   ((NULL CLASS))
	   (T                                                (* Brand new interrupt)
	      (push (fetch (KEYACTION INTERRUPTLIST)
			   TABLE)
		    (LIST CHAR CLASS HARDFLG])

(RESET.INTERRUPTS
  [LAMBDA (PermittedInterrupts SaveCurrent?)
    (DECLARE (GLOBALVARS \DEFAULTKEYACTION))                 (* bvm: "18-Jul-85 12:39")

          (* Returns list of previous settings, for use by RESETFORM but only when 2nd arg is non-NIL.
	  That way, there is no consing on the exit from the RESETLST * Note that is a list of 2-lists, and the first element 
	  of each 2-list is the charcode of the character determined.)


    (OR (NULL PermittedInterrupts)
	[AND (LISTP PermittedInterrupts)
	     (NOT (thereis X in PermittedInterrupts suchthat (NOT (AND (LISTP X)
								       (\THINCHARCODEP (CAR X]
	(\ILLEGAL.ARG PermittedInterrupts))                  (* Do the validity checking first, so that we don't get
							     an error under the UNINTERRUPTABLY)
    (UNINTERRUPTABLY
        [MAPC (fetch (KEYACTION INTERRUPTLIST) of \DEFAULTKEYACTION)
	      (FUNCTION (LAMBDA (CHAR)
		  (\INTCHAR (CAR CHAR]                       (* First, dis-arm all the current interrupts)
	[COND
	  (SaveCurrent? (SETQ SaveCurrent? (APPEND (fetch (KEYACTION INTERRUPTLIST) of 
										\DEFAULTKEYACTION)
						   NIL]
	(change (fetch (KEYACTION INTERRUPTLIST) of \DEFAULTKEYACTION)
		(APPEND PermittedInterrupts))                (* Finally, "arm" and install the desired interrupts)
	SaveCurrent?)])

(INTERRUPTABLE
  [LAMBDA (FLAG)                   (* lmm "18-APR-82 13:52")
    (PROG1 \INTERRUPTABLE (SETQ \INTERRUPTABLE FLAG])
)



(* ↑T)

(DEFINEQ

(CONTROL-T
  [LAMBDA (POS)                                              (* bvm: "31-Jul-85 19:20")

          (* * better definition: 
	  
"(PROG ((NONKEYBOARDTIME (STKNTHNAME -1 (QUOTE INTERRUPTED)))
       (POS (POSITION T)))
      (printout T T (COND
		  ((EQ NONKEYBOARDTIME (QUOTE \GETCHAR))
		    %"IO WAIT IN %")
		  (T %"RUNNING IN %"))
		.P2 NONKEYBOARDTIME %" IN %" .P2 (STKNTHNAME -2 (QUOTE INTERRUPTED))
		%" IN %"
		(STKNTHNAME -3 (QUOTE INTERRUPTED))
		%", %" .I2
	       (IQUOTIENT (ITIMES [IDIFFERENCE [SETQ NONKEYBOARDTIME
						 (IPLUS (IMINUS LAST↑TTIMEBOX)
							(SETQ LAST↑TTIMEBOX
							  (IDIFFERENCE (CLOCK0 LAST↑TTIMEBOX)
								       (fetch KEYBOARDWAITTIME 										  of \MISCSTATS]
					       (IPLUS (IMINUS LAST↑TDISKTIME)
						      (SETQ LAST↑TDISKTIME (fetch DISKTRANSFERTIME 										   of \MISCSTATS]
				  144Q)
			  NONKEYBOARDTIME)
		%"%%%% UTIL%" T)
      (POSITION T POS))")


    (UNINTERRUPTABLY                                         (* UNINTERRUPTABLY only so you can't type ↑T during ↑T)
	(PROG ((STKI (COND
		       ((STACKP POS)
			 0)
		       (T (SETQ POS)
			  -3)))
	       TEMP SWAPDELTA NETIODELTA DISKIODELTA GCDELTA KEYBOARDDELTA TOTALDELTA)
	      (SETQ TEMP (STKNTHNAME STKI POS))
	      [printout T (do (SELECTQ TEMP
				       ((\INTERRUPTFRAME \INTERRUPTED INTERRUPTED \DOINTERRUPTHERE)
                                                             (* Skip over these)
					 (SETQ TEMP (STKNTHNAME (add STKI -1)
								POS)))
				       ((\GETCHAR \GETKEY \TTYBACKGROUND)
					 (SETQ TEMP (STKNTHNAME (add STKI -1)
								POS))
					 (SETQ $$VAL "IO wait in "))
				       ((BLOCK \BACKGROUND AWAIT.EVENT MONITOR.AWAIT.EVENT 
					       \PROCESS.GO.TO.SLEEP)
                                                             (* Forms of blocking)
					 (SETQ TEMP (STKNTHNAME (add STKI -1)
								POS))
					 (SETQ $$VAL "Waiting in "))
				       (RETURN (OR $$VAL "Running in "]
	      (bind (CNT ← 0)
		 do [COND
		      ([AND (LITATOM TEMP)
			    (OR \CONTROL-T.BACKSLASH (NEQ (NTHCHARCODE TEMP 1)
							  (CHARCODE \]
			(PRIN2 TEMP T T)
			(COND
			  ((EQ (add CNT 1)
			       \CONTROL-T.DEPTH)
			    (RETURN))
			  (T (printout T " in "]
		    (SETQ TEMP (STKNTHNAME (add STKI -1)
					   POS)))
	      (COND
		((NULL LAST↑TSWAPTIME)                       (* Just initialize the first time)
		  (SETQ LAST↑TTIMEBOX (CLOCK0 LAST↑TTIMEBOX))
		  (SETQ LAST↑TSWAPTIME (fetch SWAPWAITTIME of \MISCSTATS))
		  (SETQ LAST↑TDISKIOTIME (fetch DISKIOTIME of \MISCSTATS))
		  (SETQ LAST↑TNETIOTIME (fetch NETIOTIME of \MISCSTATS))
		  (SETQ LAST↑TGCTIME (fetch GCTIME of \MISCSTATS)))
		(T (printout T ", ")                         (* calculates the amount of time spent not in disk wait
							     since the last control-T. Considers only time outside 
							     of key board wait.)
		   [SETQ TOTALDELTA (IPLUS (IMINUS LAST↑TTIMEBOX)
					   (SETQ LAST↑TTIMEBOX (CLOCK0 LAST↑TTIMEBOX]
		   (\CONTROL-T.PRINTRATIO [IDIFFERENCE TOTALDELTA
						       (IPLUS [SETQ SWAPDELTA
								(IPLUS (IMINUS LAST↑TSWAPTIME)
								       (SETQ LAST↑TSWAPTIME
									 (fetch SWAPWAITTIME
									    of \MISCSTATS]
							      [SETQ DISKIODELTA
								(IPLUS (IMINUS LAST↑TDISKIOTIME)
								       (SETQ LAST↑TDISKIOTIME
									 (fetch DISKIOTIME
									    of \MISCSTATS]
							      [SETQ NETIODELTA
								(IPLUS (IMINUS LAST↑TNETIOTIME)
								       (SETQ LAST↑TNETIOTIME
									 (fetch NETIOTIME
									    of \MISCSTATS]
							      (SETQ GCDELTA
								(IPLUS (IMINUS LAST↑TGCTIME)
								       (SETQ LAST↑TGCTIME
									 (fetch GCTIME of \MISCSTATS]
					  TOTALDELTA "%% Util" T)
		   (\CONTROL-T.PRINTRATIO SWAPDELTA TOTALDELTA "%% Swap")
		   (\CONTROL-T.PRINTRATIO DISKIODELTA TOTALDELTA "%% DskIO")
		   (\CONTROL-T.PRINTRATIO NETIODELTA TOTALDELTA "%% Network")
		   (\CONTROL-T.PRINTRATIO GCDELTA TOTALDELTA "%% GC")))
	      (TERPRI T)))])

(\CONTROL-T.PRINTRATIO
  [LAMBDA (N TOTAL LABEL NEWLINE)                            (* bvm: "31-Jul-85 19:04")
    (COND
      ((NEQ N 0)
	(COND
	  (NEWLINE (TERPRI T))
	  (T (printout T ", ")))
	[COND
	  ((OR (IGREATERP N TOTAL)
	       (ILESSP N 0))
	    (printout T "??"))
	  (T (printout T .I2 (IQUOTIENT (ITIMES N 100)
					TOTAL]
	(printout T LABEL])
)

(RPAQ? \CONTROL-T.DEPTH 3)

(RPAQ? \CONTROL-T.BACKSLASH )

(RPAQ? LAST↑TTIMEBOX (CLOCK 0))

(RPAQ? LAST↑TSWAPTIME )

(RPAQ? LAST↑TDISKIOTIME 0)

(RPAQ? LAST↑TGCTIME 0)

(RPAQ? LAST↑TNETIOTIME 0)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS \CONTROL-T.DEPTH \CONTROL-T.BACKSLASH LAST↑TTIMEBOX LAST↑TSWAPTIME LAST↑TDISKIOTIME 
	    LAST↑TNETIOTIME LAST↑TGCTIME \MISCSTATS)
)

(ADDTOVAR \SYSTEMCACHEVARS LAST↑TSWAPTIME)

(RPAQ? \CURRENTINTERRUPTS )

(RPAQ? \INTERRUPTABLE )

(RPAQ? INTERRUPTMENUFONT (QUOTE (GACHA 10)))

(RPAQQ \SYSTEMINTERRUPTS ((BREAK MOUSE)
			  (CONTROL-T)
			  (ERROR MOUSE)
			  (ERRORX)
			  (HELP T)
			  (OUTPUTBUFFER T)
			  (PRINTLEVEL)
			  (RAID T)
			  (RESET MOUSE)
			  (RUBOUT T)
			  (STORAGE)))
(DECLARE: EVAL@COMPILE DONTCOPY 

(ADDTOVAR NOFIXFNSLST CONTROL-T)

(DECLARE: DOEVAL@COMPILE DONTCOPY

(LOCALVARS . T)
)

(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS \CURRENTINTERRUPTS \SYSTEMINTERRUPTS INTERRUPTMENUFONT)
)
)
(DECLARE: EVAL@COMPILE 
(* FOLLOWING DEFINITIONS EXPORTED)



(ADDTOVAR SYSSPECVARS \INTERRUPTABLE)

(PUTPROPS UNINTERRUPTABLY INFO EVAL)

(PUTPROPS UNINTERRUPTABLY DMACRO ((X . Y)
				  ([LAMBDA (\INTERRUPTABLE)
					   (PROGN X . Y]
				   NIL)))

(ADDTOVAR PRETTYPRINTMACROS (UNINTERRUPTABLY
                                LAMBDA (FORM)
				(PROG [(POS (IPLUS 4 (POSITION]
				      (PRIN1 "(")
				      (PRIN2 (CAR FORM))
				      (OR [EQ COMMENTFLG (CAAR (SETQ FORM (CDR FORM]
					  (TAB POS 0))
				      (PRINTDEF FORM POS T T FNSLST)
				      (PRIN1 ")"))))


(* END EXPORTED DEFINITIONS)

DONTCOPY 
(* FOLLOWING DEFINITIONS EXPORTED)


[DECLARE: EVAL@COMPILE 

(BLOCKRECORD INTERRUPTSTATE ((NIL BITS 4)
			     (VMEMFULL FLAG)
			     (STACKOVERFLOW FLAG)
			     (STORAGEFULL FLAG)
			     (WAITINGINTERRUPT FLAG)
			     (INTCHARCODE BYTE)))
]

(PUTPROPS \TAKEINTERRUPT DMACRO ((PREFORM POSTFORM)
				 (DECLARE (GLOBALVARS \PENDINGINTERRUPT))
				 (COND ((AND \PENDINGINTERRUPT (INTERRUPTABLE~=NILUPTHESTACK))
					PREFORM
					([LAMBDA (\INTERRUPTABLE)
						 (\CALLINTERRUPTED]
					 T)
					POSTFORM))))


(* END EXPORTED DEFINITIONS)


(DECLARE: EVAL@COMPILE 
(PUTPROPS \SYSTEMINTERRUPTP MACRO ((KEY)
	   (ASSOC KEY \SYSTEMINTERRUPTS)))
)
)
(PUTPROPS AINTERRUPT COPYRIGHT ("Xerox Corporation" 1982 1983 1984 1985))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (1881 18985 (INTCHAR 1891 . 5894) (INTERRUPTCHAR 5896 . 6203) (INTERRUPTED 6205 . 8690) 
(LISPINTERRUPTS 8692 . 8966) (\DOHELPINTERRUPT 8968 . 9664) (\DOHELPINTERRUPT1 9666 . 10675) (
\DOINTERRUPTHERE 10677 . 11597) (\DOSTACKFULLINTERRUPT 11599 . 11869) (\PROC.FINDREALFRAME 11871 . 
12566) (\SETPRINTLEVEL 12568 . 13884) (\SETRECLAIMMIN 13886 . 14597) (GETINTERRUPT 14599 . 15579) (
CURRENTINTERRUPTS 15581 . 15793) (SETINTERRUPT 15795 . 17366) (RESET.INTERRUPTS 17368 . 18844) (
INTERRUPTABLE 18846 . 18983)) (19001 23778 (CONTROL-T 19011 . 23370) (\CONTROL-T.PRINTRATIO 23372 . 
23776)))))
STOP