Changeset 478


Ignore:
Timestamp:
Feb 6, 2004, 11:33:35 AM (21 years ago)
Author:
Gary Byers
Message:

INPUT-STREAMs may have a SHARED-RESOURCE attached to them; use it to
manage terminal-input requests.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/level-1/l1-streams.lisp

    r462 r478  
    2828   (closed :initform nil)))
    2929
    30 (defclass input-stream (stream) ())
     30(defclass input-stream (stream)
     31  ((shared-resource :initform nil :accessor input-stream-shared-resource)))
     32
    3133(defclass output-stream (stream) ())
    3234
     
    23842386
    23852387(defun %request-terminal-input ()
    2386   (if (and (typep *terminal-io* 'two-way-stream)
    2387            (eq *terminal-input* (two-way-stream-input-stream *terminal-io*)))
    2388     (let* ((lock *terminal-input-lock*)
    2389            (current *current-process*))
    2390       (unless (%try-recursive-lock (recursive-lock-ptr lock))
    2391         (%note-terminal-input-request  current)
    2392         t))))
    2393 
    2394 (defglobal *terminal-input-requests* ())
    2395 
    2396 (defvar *request-terminal-input-via-break* nil)
    2397 
    2398 (defun %note-terminal-input-request (requestor)
    2399   (push requestor *terminal-input-requests*)
    2400   (let* ((name (process-name requestor))
    2401          (psn (process-serial-number requestor)))
    2402     (format *terminal-output*
    2403             "~&;;~&;; Process ~a(~d) needs access to terminal input.~&;;~%"
    2404             name psn)
    2405     (force-output *terminal-output*)
    2406     (let* ((lock *terminal-input-lock*))
    2407       (process-wait
    2408        "terminal-input wait" #'(lambda ()
    2409                                  (%try-recursive-lock
    2410                                   (recursive-lock-ptr lock))))
    2411       (setq *terminal-input-requests*
    2412             (delete requestor *terminal-input-requests*))
    2413       (format *terminal-output*
    2414               "~&;;~&;; process ~a(~d) now controls terminal input~&;;~%"
    2415               name
    2416               psn))))
    2417 
    2418 (defun %%release-terminal-io ()
    2419   (let* ((lockptr (recursive-lock-ptr *terminal-input-lock*)))
    2420     (loop
    2421         (unless (zerop (the fixnum (%unlock-recursive-lock lockptr)))
    2422           (return)))))
    2423 
    2424 (defun %%yield-terminal-to (&optional requestor)
    2425   (declare (ignore requestor))
    2426   (let* ((lockptr (recursive-lock-ptr *terminal-input-lock*))
    2427          (self *current-process*))
    2428     (%%release-terminal-io)
    2429     (sleep 1)
    2430     (process-wait "terminal input return"
    2431                   #'%try-recursive-lock lockptr)
    2432     (clear-input *terminal-input*)
    2433     (format *terminal-output*
    2434             "~&;;~&;; control of terminal input restored to process ~a(~d)~&;;~%"
    2435             (process-name self) (process-serial-number self))))
     2388  (let* ((shared-resource
     2389          (if (typep *terminal-io* 'two-way-stream)
     2390            (input-stream-shared-resource
     2391             (two-way-stream-input-stream *terminal-io*)))))
     2392    (if shared-resource (%acquire-shared-resource shared-resource t))))
     2393
     2394
     2395
     2396
     2397(defun %%yield-terminal-to (&optional process)
     2398  (let* ((shared-resource
     2399          (if (typep *terminal-io* 'two-way-stream)
     2400            (input-stream-shared-resource
     2401             (two-way-stream-input-stream *terminal-io*)))))
     2402    (when shared-resource (%yield-shared-resource shared-resource process))))
    24362403
    24372404(defun %restore-terminal-input (&optional took-it)
    2438   (when took-it
    2439     (%unlock-recursive-lock (recursive-lock-ptr *terminal-input-lock*))))
     2405  (let* ((shared-resource
     2406          (if took-it
     2407            (if (typep *terminal-io* 'two-way-stream)
     2408              (input-stream-shared-resource
     2409               (two-way-stream-input-stream *terminal-io*))))))
     2410    (when shared-resource
     2411      (%release-shared-resource shared-resource))))
    24402412
    24412413;;; Initialize the global streams
Note: See TracChangeset for help on using the changeset viewer.