Changeset 478
- Timestamp:
- Feb 6, 2004, 11:33:35 AM (21 years ago)
- File:
-
- 1 edited
-
trunk/ccl/level-1/l1-streams.lisp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/level-1/l1-streams.lisp
r462 r478 28 28 (closed :initform nil))) 29 29 30 (defclass input-stream (stream) ()) 30 (defclass input-stream (stream) 31 ((shared-resource :initform nil :accessor input-stream-shared-resource))) 32 31 33 (defclass output-stream (stream) ()) 32 34 … … 2384 2386 2385 2387 (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)))) 2436 2403 2437 2404 (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)))) 2440 2412 2441 2413 ;;; Initialize the global streams
Note:
See TracChangeset
for help on using the changeset viewer.
