(FILECREATED "19-Mar-79 19:42:08" <LISPUSERS>IOWAITDAEMON..3    3367


     changes to:  IOWAITDAEMON

     previous date: " 2-Jan-79 11:29:48" <LISPUSERS>IOWAITDAEMON..2)


(PRETTYCOMPRINT IOWAITDAEMONCOMS)

(RPAQQ IOWAITDAEMONCOMS [[DECLARE: FIRST
				   (P (MOVD? (QUOTE PROMPTCHAR)
					     (QUOTE OLDPROMPTCHAR]
			 (FNS IOWAITDAEMON PROMPTCHAR)
			 (VARS (IOWAITSLEEPINTERVAL 500)
			       (IOWAITDAEMONINTERVAL 60000)
			       (IOWAITDAEMONHARRAY (LIST (HARRAY 10)))
			       (IOWaitDaemonTimer 123456789))
			 (ADDVARS (IOWAITDAEMONFORMS)
				  (AFTERSYSOUTFORMS (CLRHASH 
						     IOWAITDAEMONHARRAY)))
			 (P (RELINK (QUOTE WORLD)))
			 (DECLARE: EVAL@COMPILE DONTCOPY
				   (P (RESETSAVE DWIMIFYCOMPFLG T])
(DECLARE: FIRST 
(MOVD? (QUOTE PROMPTCHAR)
       (QUOTE OLDPROMPTCHAR))
)
(DEFINEQ

(IOWAITDAEMON
  [LAMBDA NIL                                (* Edited by M.Yonke on 
					     19-Mar-79.)

    (* * This package simulates an IO Wait Daemon by redefining 
    PROMPTCHAR. The function IOWAITDAEMON is called and after 
    every IOWAITDAEMONINTERVAL minutes then it looks at every form
    on IOWAITDAEMONFORMS and see if its time to eval them.
    The time for the next eval is kept in a hash array using form 
    as the the hash key. Each form is responsible for returning 
    the time in minutes it should wait before evaling again.
    The default is one minute. IOWAITSLEEPINTERVAL is the time in 
    milliseconds to go to sleep before waking up to see if there 
    is any input. -
    NOTE: if READBUF is non-NIL then PROMPTCHAR is being called in
    a REDO or FIX and therefore should not go into the DISMISS 
    loop)


    (if IOWAITDAEMONFORMS and ~READBUF and ~(READP T)
	then
	 (while ~(READP T)
	    do
	     (if (IGEQ (SETN IOWaitDaemonTimer 
			     IOWaitDaemonTimer+IOWAITSLEEPINTERVAL)
		       IOWAITDAEMONINTERVAL)
		 then
		  (for form in IOWAITDAEMONFORMS bind IOWAITDAEMONFORMS
		     do                      (* bind IOWAITDAEMONFORMS to 
					     NIL in case a break occurs 
					     below)
                                             (* now process forms)
		      (if ((GETHASH form IOWAITDAEMONHARRAY) or 0) lt
			  (CLOCK 0)
			  then
			   (PUTHASH
			     form
			     (CLOCK 0)+(60000*([FIXP
				  (CAR (ERSETQ (EVAL form]
				  or 1))
			     IOWAITDAEMONHARRAY))
		     eachtime (if (READP T)
				  then (RETURN)))
                                             (* reset internal timer)
		  (SETN IOWaitDaemonTimer 0))
	     (if (READP T)
		 then (RETURN)
	       else                          (* sleep for a short time)
		    (DISMISS IOWAITSLEEPINTERVAL])

(PROMPTCHAR
  [LAMBDA (ID FLG HISTORY)                      (* Edited by M.Yonke on 
						21-Aug-78.)

    (* * This function gets moved to the PROMPTCHAR function cell 
    to implement the IOWAITDAEMON function.
    First it calls the old PROMPTCHAR and then calls IOWAITDAEMON 
    which loops until something has been typed.)


    (PROG1 (OLDPROMPTCHAR ID FLG HISTORY)
	   (IOWAITDAEMON])
)

(RPAQ IOWAITSLEEPINTERVAL 500)

(RPAQ IOWAITDAEMONINTERVAL 60000)

(RPAQ IOWAITDAEMONHARRAY (LIST (HARRAY 10)))

(RPAQ IOWaitDaemonTimer 123456789)

(ADDTOVAR IOWAITDAEMONFORMS )

(ADDTOVAR AFTERSYSOUTFORMS (CLRHASH IOWAITDAEMONHARRAY))
(RELINK (QUOTE WORLD))
(DECLARE: EVAL@COMPILE DONTCOPY 
(RESETSAVE DWIMIFYCOMPFLG T)
)
(DECLARE: DONTCOPY
  (FILEMAP (NIL (800 3020 (IOWAITDAEMON 810 . 2622) (PROMPTCHAR 2624 . 3018)))))
STOP