Use new I/O synchronization primitives. Requires microcode 14.11 or
authorChris Hanson <org/chris-hanson/cph>
Wed, 22 Jan 2003 02:06:44 +0000 (02:06 +0000)
committerChris Hanson <org/chris-hanson/cph>
Wed, 22 Jan 2003 02:06:44 +0000 (02:06 +0000)
later.

12 files changed:
v7/src/runtime/dosprm.scm
v7/src/runtime/io.scm
v7/src/runtime/ntprm.scm
v7/src/runtime/os2graph.scm
v7/src/runtime/os2prm.scm
v7/src/runtime/runtime.pkg
v7/src/runtime/socket.scm
v7/src/runtime/thread.scm
v7/src/runtime/unxprm.scm
v7/src/runtime/version.scm
v7/src/runtime/x11graph.scm
v7/src/swat/scheme/mit-xhooks.scm

index 909246b3abb1d170b4f73a368a291d88d8d4adf9..574ce74204948b5a5acaefc6b7ddf5e8edb77368 100644 (file)
@@ -1,8 +1,9 @@
 #| -*-Scheme-*-
 
-$Id: dosprm.scm,v 1.44 2002/11/20 19:46:19 cph Exp $
+$Id: dosprm.scm,v 1.45 2003/01/22 02:04:55 cph Exp $
 
-Copyright (c) 1992-2000 Massachusetts Institute of Technology
+Copyright 1992,1993,1994,1995,1996,1998 Massachusetts Institute of Technology
+Copyright 1999,2000,2003 Massachusetts Institute of Technology
 
 This file is part of MIT Scheme.
 
@@ -403,92 +404,9 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                 (close-port port)
                 (set! port #f)
                 unspecific))))))))
-\f
-(define (select-internal console? handles block?)
-  (let* ((nt/qs-allinput #xff)
-        (select
-         (if console?
-             (lambda (period)
-               ((ucode-primitive nt:msgwaitformultipleobjects 4)
-                handles #f period nt/qs-allinput))
-             (lambda (period)
-               ((ucode-primitive nt:waitformultipleobjects 3)
-                handles #f period)))))
-    (if (not block?)
-       (select 0)
-       (let loop ()
-         (let ((res (select 20)))
-           (if (zero? res)
-               (loop)
-               res))))))
               
 (define console-channel-descriptor)
 
 (define (cache-console-channel-descriptor!)
   (set! console-channel-descriptor -1)
-  unspecific)
-
-(define (select-descriptor descriptor block?)
-  (define (select-result result)
-    (cond ((fix:> result 0)
-          'INPUT-AVAILABLE)
-         ((fix:< result 0)
-          (error "Illegal result from select-internal" result))
-         (else
-          #f)))
-
-  (select-result
-   (if (= descriptor console-channel-descriptor)
-       (select-internal true '#() block?)
-       (select-internal false (vector descriptor) block?))))
-\f
-(define-structure (nt-select-registry
-                  (conc-name nt-select-registry/)
-                  (constructor nt-select-registry/make))
-  console
-  descriptors)
-
-(define-integrable (find-descriptor df dl)
-  (list-search-positive dl
-    (lambda (d)
-      (= d df))))
-
-(define (make-select-registry . descriptors)
-  (cond ((find-descriptor console-channel-descriptor descriptors)
-        => (lambda (ccd)
-             (nt-select-registry/make console-channel-descriptor
-                                      (delq! ccd descriptors))))
-       (else
-        (nt-select-registry/make false descriptors))))
-
-(define (add-to-select-registry! registry descriptor)
-  (cond ((= descriptor console-channel-descriptor)
-        (set-nt-select-registry/console! registry console-channel-descriptor))
-       ((not (find-descriptor descriptor
-                              (nt-select-registry/descriptors registry)))
-        (set-nt-select-registry/descriptors!
-         registry
-         (cons descriptor (nt-select-registry/descriptors registry))))))
-
-(define (remove-from-select-registry! registry descriptor)
-  (cond ((= descriptor console-channel-descriptor)
-        (set-nt-select-registry/console! registry false))
-       ((find-descriptor descriptor (nt-select-registry/descriptors registry))
-        => (lambda (dr)
-             (set-nt-select-registry/descriptors!
-              registry
-              (delq! dr (nt-select-registry/descriptors registry)))))))
-
-(define (select-registry-test registry block?)
-  (let* ((handles (list->vector (nt-select-registry/descriptors registry)))
-        (result (select-internal (nt-select-registry/console registry)
-                                 handles
-                                 block?)))
-    (cond ((fix:< result 0)
-          (error "Illegal result from select-internal" result))
-         ((fix:= result 0)
-          #f)
-         ((fix:> result (vector-length handles))
-          (list (nt-select-registry/console registry)))
-         (else
-          (list (vector-ref handles (fix:- result 1)))))))
\ No newline at end of file
+  unspecific)
\ No newline at end of file
index 962d13846a520be568b1ddc4c25dfb7425ce8a6c..9e2521f6e5a1a40a526234766f5c0b01b50ca947 100644 (file)
@@ -1,8 +1,10 @@
 #| -*-Scheme-*-
 
-$Id: io.scm,v 14.66 2002/12/09 05:40:04 cph Exp $
+$Id: io.scm,v 14.67 2003/01/22 02:05:02 cph Exp $
 
-Copyright (c) 1988-2002 Massachusetts Institute of Technology
+Copyright 1986,1987,1988,1990,1991,1993 Massachusetts Institute of Technology
+Copyright 1994,1995,1998,1999,2000,2001 Massachusetts Institute of Technology
+Copyright 2002,2003 Massachusetts Institute of Technology
 
 This file is part of MIT Scheme.
 
@@ -29,15 +31,16 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 \f
 (define open-channels-list)
 (define open-directories)
-(define have-select?)
 
 (define (initialize-package!)
   (set! open-channels-list (list 'OPEN-CHANNELS-LIST))
   (add-gc-daemon! close-lost-open-files-daemon)
   (set! open-directories
        (make-gc-finalizer (ucode-primitive new-directory-close 1)))
-  (set! have-select? ((ucode-primitive have-select? 0)))
-  (add-event-receiver! event:after-restore primitive-io/reset!))
+  (add-event-receiver! event:after-restore
+    (lambda ()
+      (close-all-open-channels-internal (lambda (ignore) ignore))))
+  (initialize-select-registry!))
 
 (define-structure (channel (constructor %make-channel))
   ;; This structure serves two purposes.  First, because a descriptor
@@ -77,7 +80,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
        (system-pair-set-car! p channel)
        (set-cdr! open-channels-list (cons p (cdr open-channels-list)))))
     channel))
-
+\f
 (define (descriptor->channel descriptor)
   (let loop ((channels (cdr open-channels-list)))
     (and (not (null? channels))
@@ -104,7 +107,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     (or (eq? 'TERMINAL type)
        (eq? 'UNIX-PTY-MASTER type)
        (eq? 'OS/2-CONSOLE type))))
-\f
+
 (define (channel-close channel)
   (without-interrupts
    (lambda ()
@@ -127,7 +130,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 (define-integrable (channel-closed? channel)
   (not (channel-descriptor channel)))
-
+\f
 (define (close-all-open-files)
   (close-all-open-channels channel-type=file?))
 
@@ -151,13 +154,6 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
           result
           (loop (cdr l) (cons (system-pair-car (car l)) result)))))))
 
-(define (primitive-io/reset!)
-  ;; This is invoked after disk-restoring.
-  ;; It "cleans" the new runtime system.
-  (close-all-open-channels-internal (lambda (ignore) ignore))
-  (set! have-select? ((ucode-primitive have-select? 0)))
-  unspecific)
-
 (define (close-all-open-channels-internal action)
   (without-interrupts
    (lambda ()
@@ -246,9 +242,9 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
          (lambda ()
            (let ((do-test
                   (lambda (k)
-                    (let ((result (test-for-input-on-channel channel)))
+                    (let ((result (test-for-io-on-channel channel 'READ)))
                       (case result
-                        ((INPUT-AVAILABLE)
+                        ((READ)
                          (do-read))
                         ((PROCESS-STATUS-CHANGE)
                          (handle-subprocess-status-change)
@@ -265,15 +261,16 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     (or (channel-read channel buffer start end)
        (loop))))
 
-(define-integrable (test-for-input-on-channel channel)
-  (test-for-input-on-descriptor (channel-descriptor-for-select channel)
-                               (channel-blocking? channel)))
+(define (test-for-io-on-channel channel mode)
+  (test-for-io-on-descriptor (channel-descriptor-for-select channel)
+                            (channel-blocking? channel)
+                            mode))
 
-(define (test-for-input-on-descriptor descriptor block?)
+(define (test-for-io-on-descriptor descriptor block? mode)
   (if block?
-      (or (select-descriptor descriptor #f)
-         (block-on-input-descriptor descriptor))
-      (select-descriptor descriptor #f)))
+      (or (test-select-descriptor descriptor #f mode)
+         (block-on-io-descriptor descriptor mode))
+      (test-select-descriptor descriptor #f mode)))
 
 (define-integrable (channel-descriptor-for-select channel)
   ((ucode-primitive channel-descriptor 1) (channel-descriptor channel)))
@@ -1185,4 +1182,137 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
             (if (fix:> contents-size (string-length string))
                 (input-buffer/set-size buffer contents-size))
             (substring-move! contents 0 contents-size string 0)
-            (input-buffer/after-fill! buffer contents-size)))))))
\ No newline at end of file
+            (input-buffer/after-fill! buffer contents-size)))))))
+\f
+;;;; Select registry
+
+(define have-select?)
+(define select-registry-finalizer)
+(define select-registry-result-vectors)
+
+(define (initialize-select-registry!)
+  (set! have-select? ((ucode-primitive have-select? 0)))
+  (set! select-registry-finalizer
+       (make-gc-finalizer (ucode-primitive deallocate-select-registry 1)))
+  (let ((reset-rv!
+        (lambda ()
+          (set! select-registry-result-vectors '())
+          unspecific)))
+    (reset-rv!)
+    (add-event-receiver! event:after-restart reset-rv!))
+  (add-event-receiver! event:after-restore
+    (lambda ()
+      (set! have-select? ((ucode-primitive have-select? 0)))
+      unspecific)))
+
+(define-structure (select-registry
+                  (constructor %make-select-registry (handle)))
+  handle
+  (length #f))
+
+(define (make-select-registry)
+  (without-interrupts
+   (lambda ()
+     (let ((handle ((ucode-primitive allocate-select-registry 0))))
+       (let ((registry (%make-select-registry handle)))
+        (add-to-gc-finalizer! select-registry-finalizer registry handle)
+        registry)))))
+
+(define (add-to-select-registry! registry descriptor mode)
+  ((ucode-primitive add-to-select-registry 3)
+   (select-registry-handle registry)
+   descriptor
+   (encode-select-registry-mode mode))
+  (set-select-registry-length! registry #f))
+
+(define (remove-from-select-registry! registry descriptor mode)
+  ((ucode-primitive remove-from-select-registry 3)
+   (select-registry-handle registry)
+   descriptor
+   (encode-select-registry-mode mode))
+  (set-select-registry-length! registry #f))
+
+(define (test-select-descriptor descriptor block? mode)
+  (let ((result
+        ((ucode-primitive test-select-descriptor 3)
+         descriptor
+         block?
+         (encode-select-registry-mode mode))))
+    (case result
+      ((0) #f)
+      ((1) 'READ)
+      ((2) 'WRITE)
+      ((3) 'READ/WRITE)
+      ((-1) 'INTERRUPT)
+      ((-2)
+       (subprocess-global-status-tick)
+       'PROCESS-STATUS-CHANGE)
+      (else (error "Illegal result from TEST-SELECT-DESCRIPTOR:" result)))))
+
+(define (encode-select-registry-mode mode)
+  (case mode
+    ((READ) 1)
+    ((WRITE) 2)
+    ((READ/WRITE) 3)
+    (else (error:bad-range-argument mode 'ENCODE-SELECT-REGISTRY-MODE))))
+\f
+(define (test-select-registry registry block?)
+  (receive (vr vw) (allocate-select-registry-result-vectors registry)
+    (let ((result
+          ((ucode-primitive test-select-registry 4)
+           (select-registry-handle registry)
+           block?
+           vr
+           vw)))
+      (if (> result 0)
+         (cons vr vw)
+         (begin
+           (deallocate-select-registry-result-vectors vr vw)
+           (cond ((= 0 result) #f)
+                 ((= -1 result) 'INTERRUPT)
+                 ((= -2 result)
+                  (subprocess-global-status-tick)
+                  'PROCESS-STATUS-CHANGE)
+                 (else
+                  (error "Illegal result from TEST-SELECT-REGISTRY:"
+                         result))))))))
+
+(define (allocate-select-registry-result-vectors registry)
+  (let ((interrupt-mask (set-interrupt-enables! interrupt-mask/gc-ok)))
+    (let ((n
+          (or (select-registry-length registry)
+              (let ((rl
+                     ((ucode-primitive select-registry-length 1)
+                      (select-registry-handle registry))))
+                (set-select-registry-length! registry rl)
+                rl))))
+      (let loop ((rv select-registry-result-vectors))
+       (if (pair? rv)
+           (let ((vr (caar rv))
+                 (vw (cdar rv)))
+             (if (and vr (fix:< n (vector-length vr)))
+                 (begin
+                   (set-car! (car rv) #f)
+                   (set-cdr! (car rv) #f)
+                   (set-interrupt-enables! interrupt-mask)
+                   (values vr vw))
+                 (loop (cdr rv))))
+           (let loop ((m 16))
+             (if (fix:< n m)
+                 (begin
+                   (set-interrupt-enables! interrupt-mask)
+                   (values (make-vector m) (make-vector m)))
+                 (loop (fix:* m 2)))))))))
+
+(define (deallocate-select-registry-result-vectors vr vw)
+  (let ((interrupt-mask (set-interrupt-enables! interrupt-mask/gc-ok)))
+    (let loop ((rv select-registry-result-vectors))
+      (if (pair? rv)
+         (if (caar rv)
+             (loop (cdr rv))
+             (begin
+               (set-car! (car rv) vr)
+               (set-cdr! (car rv) vw)))
+         (set! select-registry-result-vectors
+               (cons (cons vr vw) select-registry-result-vectors))))
+    (set-interrupt-enables! interrupt-mask)))
\ No newline at end of file
index 0c16d8ff76cf6a9e7f328258d7806a7f900ea1e9..03cb73d0470bea179b31d503f0224aed03ace02b 100644 (file)
@@ -1,8 +1,9 @@
 #| -*-Scheme-*-
 
-$Id: ntprm.scm,v 1.38 2002/11/20 19:46:21 cph Exp $
+$Id: ntprm.scm,v 1.39 2003/01/22 02:05:08 cph Exp $
 
-Copyright (c) 1992-2001 Massachusetts Institute of Technology
+Copyright 1995,1996,1998,1999,2000,2001 Massachusetts Institute of Technology
+Copyright 2003 Massachusetts Institute of Technology
 
 This file is part of MIT Scheme.
 
@@ -449,55 +450,9 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                       (set! port #f)
                       unspecific))))))))))
 \f
-(define-structure (nt-select-registry (conc-name nt-select-registry/))
-  descriptors)
-
-(define (make-select-registry . descriptors)
-  (make-nt-select-registry descriptors))
-
-(define (add-to-select-registry! registry descriptor)
-  (if (not (memv descriptor (nt-select-registry/descriptors registry)))
-      (set-nt-select-registry/descriptors!
-       registry
-       (cons descriptor (nt-select-registry/descriptors registry)))))
-
-(define (remove-from-select-registry! registry descriptor)
-  (set-nt-select-registry/descriptors!
-   registry
-   (delv! descriptor (nt-select-registry/descriptors registry))))
-
-(define (select-registry-test registry block?)
-  (let ((descriptors (list->vector (nt-select-registry/descriptors registry))))
-    (let ((result
-          ((ucode-primitive nt:waitformultipleobjects 3)
-           descriptors #f block?)))
-      (cond ((and (fix:<= 0 result) (fix:< result (vector-length descriptors)))
-            (list (vector-ref descriptors result)))
-           ((fix:= result -1) #f)
-           ((fix:= result -2) 'INTERRUPT)
-           ((fix:= result -3) 'PROCESS-STATUS-CHANGE)
-           (else (error "Illegal result from select-internal:" result))))))
-
-(define (select-descriptor descriptor block?)
-  (let ((result
-        ((ucode-primitive nt:waitformultipleobjects 3)
-         (vector descriptor) #f block?)))
-    (case result
-      ((0) 'INPUT-AVAILABLE)
-      ((-1) #f)
-      ((-2) 'INTERRUPT)
-      ((-3) 'PROCESS-STATUS-CHANGE)
-      (else (error "Illegal result from select-internal:" result)))))
-
-(define console-channel-descriptor)
-
-(define (cache-console-channel-descriptor!)
-  (set! console-channel-descriptor
-       (channel-descriptor-for-select (tty-input-channel)))
-  unspecific)
-\f
 ;;;; Subprocess/Shell Support
 
+(define console-channel-descriptor)
 (define nt/hide-subprocess-windows?)
 (define nt/subprocess-argument-quote-char)
 (define nt/subprocess-argument-escape-char)
@@ -506,7 +461,9 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   (let ((reset!
         (lambda ()
           (reset-environment-variables!)
-          (cache-console-channel-descriptor!))))
+          (set! console-channel-descriptor
+                (channel-descriptor-for-select (tty-input-channel)))
+          unspecific)))
     (reset!)
     (add-event-receiver! event:after-restart reset!))
   (set! nt/hide-subprocess-windows? #t)
index 9530c1c2b9ede8169297b0836066881449ffb68d..922dace8e4b2865aec3f6f7fde1487c07d06be70 100644 (file)
@@ -1,8 +1,9 @@
 #| -*-Scheme-*-
 
-$Id: os2graph.scm,v 1.20 2002/11/20 19:46:21 cph Exp $
+$Id: os2graph.scm,v 1.21 2003/01/22 02:05:15 cph Exp $
 
-Copyright (c) 1995-2002 Massachusetts Institute of Technology
+Copyright 1995,1996,1997,1999,2000 Massachusetts Institute of Technology
+Copyright 2001,2002,2003 Massachusetts Institute of Technology
 
 This file is part of MIT Scheme.
 
@@ -119,7 +120,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
        (set! graphics-window-icon)
        (remove-all-from-gc-finalizer! window-finalizer)
        (remove-all-from-gc-finalizer! image-finalizer)
-       (deregister-input-thread-event event-previewer-registration)
+       (deregister-io-thread-event event-previewer-registration)
        (set! event-previewer-registration #f)
        (set! user-event-mask user-event-mask:default)
        (flush-queue! user-event-queue)
@@ -207,10 +208,13 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
       (begin
        (set! event-descriptor (os2win-open-event-qid))
        (set! event-previewer-registration
-             (permanently-register-input-thread-event
+             (permanently-register-io-thread-event
               event-descriptor
+              'READ
               (current-thread)
-              read-and-process-event))
+              (lambda (mode)
+                mode
+                (read-and-process-event))))
        (set! graphics-window-icon
              (os2win-load-pointer HWND_DESKTOP NULLHANDLE IDI_GRAPHICS))))
   (open-window descriptor->device
@@ -850,8 +854,8 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
      (let loop ()
        (if (queue-empty? user-event-queue)
           (begin
-            (if (eq? 'INPUT-AVAILABLE
-                     (test-for-input-on-descriptor event-descriptor #t))
+            (if (eq? 'READ
+                     (test-for-io-on-descriptor event-descriptor #t 'READ))
                 (read-and-process-event))
             (loop))
           (dequeue! user-event-queue))))))
index 28bef94d14d402ecd08692ccf38c002d174484ea..9c8d19460217318deeed8cb611e5c37ef2a3d4f9 100644 (file)
@@ -1,8 +1,9 @@
 #| -*-Scheme-*-
 
-$Id: os2prm.scm,v 1.49 2002/11/20 19:46:21 cph Exp $
+$Id: os2prm.scm,v 1.50 2003/01/22 02:05:21 cph Exp $
 
-Copyright (c) 1994-2001 Massachusetts Institute of Technology
+Copyright 1994,1995,1997,1998,1999,2000 Massachusetts Institute of Technology
+Copyright 2001,2003 Massachusetts Institute of Technology
 
 This file is part of MIT Scheme.
 
@@ -348,100 +349,10 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                       (close-port port)
                       (set! port #f)
                       unspecific))))))))))
-\f
-(define (initialize-system-primitives!)
-  (discard-select-registry-result-vectors!)
-  (add-event-receiver! event:after-restart
-                      discard-select-registry-result-vectors!))
-
-(define os2/select-registry-lub)
-(define select-registry-result-vectors)
-
-(define (discard-select-registry-result-vectors!)
-  (set! os2/select-registry-lub ((ucode-primitive os2-select-registry-lub 0)))
-  (set! select-registry-result-vectors '())
-  unspecific)
 
-(define (allocate-select-registry-result-vector)
-  (let ((interrupt-mask (set-interrupt-enables! interrupt-mask/gc-ok)))
-    (let ((v
-          (let loop ((rv select-registry-result-vectors))
-            (if (pair? rv)
-                (let ((v (car rv)))
-                  (if v
-                      (begin
-                        (set-car! rv #f)
-                        v)
-                      (loop (cdr rv))))
-                (make-string os2/select-registry-lub)))))
-      (set-interrupt-enables! interrupt-mask)
-      v)))
-
-(define (deallocate-select-registry-result-vector v)
-  (let ((interrupt-mask (set-interrupt-enables! interrupt-mask/gc-ok)))
-    (let loop ((rv select-registry-result-vectors))
-      (if (pair? rv)
-         (if (car rv)
-             (loop (cdr rv))
-             (set-car! rv v))
-         (set! select-registry-result-vectors
-               (cons v select-registry-result-vectors))))
-    (set-interrupt-enables! interrupt-mask))
+(define (initialize-system-primitives!)
   unspecific)
 \f
-(define (make-select-registry . descriptors)
-  (let ((registry (make-string os2/select-registry-lub)))
-    (vector-8b-fill! registry 0 os2/select-registry-lub 0)
-    (do ((descriptors descriptors (cdr descriptors)))
-       ((not (pair? descriptors)))
-      (add-to-select-registry! registry (car descriptors)))
-    registry))
-
-(define (os2/guarantee-select-descriptor descriptor procedure)
-  (if (not (and (fix:fixnum? descriptor)
-               (fix:<= 0 descriptor)
-               (fix:< descriptor os2/select-registry-lub)))
-      (error:wrong-type-argument descriptor "select descriptor" procedure))
-  descriptor)
-
-(define (add-to-select-registry! registry descriptor)
-  (os2/guarantee-select-descriptor descriptor 'ADD-TO-SELECT-REGISTRY!)
-  (vector-8b-set! registry descriptor 1))
-
-(define (remove-from-select-registry! registry descriptor)
-  (os2/guarantee-select-descriptor descriptor 'REMOVE-FROM-SELECT-REGISTRY!)
-  (vector-8b-set! registry descriptor 0))
-
-(define (select-descriptor descriptor block?)
-  (vector-ref os2/select-result-values
-             ((ucode-primitive os2-select-descriptor 2) descriptor block?)))
-
-(define (select-registry-test registry block?)
-  (let ((result-vector (allocate-select-registry-result-vector)))
-    (let ((result
-          ((ucode-primitive os2-select-registry-test 3) registry
-                                                        result-vector
-                                                        block?)))
-      (if (fix:= result 0)
-         (let loop
-             ((index (fix:- os2/select-registry-lub 1))
-              (descriptors '()))
-           (let ((descriptors
-                  (if (fix:= 0 (vector-8b-ref result-vector index))
-                      descriptors
-                      (cons index descriptors))))
-             (if (fix:= 0 index)
-                 (begin
-                   (deallocate-select-registry-result-vector result-vector)
-                   descriptors)
-                 (loop (fix:- index 1) descriptors))))
-         (begin
-           (deallocate-select-registry-result-vector result-vector)
-           (vector-ref os2/select-result-values result))))))
-
-(define os2/select-result-values
-  '#(INPUT-AVAILABLE #F INTERRUPT PROCESS-STATUS-CHANGE))
-\f
 ;;;; Subprocess/Shell Support
 
 (define (os/make-subprocess filename arguments environment working-directory
index d7c15e7672ce6cac4aa91ceaeec91f79256e3a1d..272522bc8485324a18f02d26742ad194b9d75d39 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Id: runtime.pkg,v 14.422 2003/01/09 19:36:50 cph Exp $
+$Id: runtime.pkg,v 14.423 2003/01/22 02:05:28 cph Exp $
 
 Copyright (c) 1988,1989,1990,1991,1992 Massachusetts Institute of Technology
 Copyright (c) 1993,1994,1995,1996,1997 Massachusetts Institute of Technology
@@ -568,7 +568,6 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 (define-package (runtime os-primitives)
   (parent (runtime))
   (export ()
-         add-to-select-registry!
          copy-file
          current-home-directory
          current-user-name
@@ -598,7 +597,6 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
          file-time->universal-time
          get-environment-variable
          init-file-specifier->pathname
-         make-select-registry
          os/default-end-of-line-translation
          os/exec-path
          os/executable-pathname-types
@@ -608,9 +606,6 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
          os/make-subprocess
          os/parse-path-string
          os/shell-file-name
-         remove-from-select-registry!
-         select-descriptor
-         select-registry-test
          set-file-modes!
          set-file-times!
          temporary-directory-pathname
@@ -2530,8 +2525,8 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
          terminal-raw-input
          terminal-raw-output
          terminal-set-state
-         test-for-input-on-channel
-         test-for-input-on-descriptor
+         test-for-io-on-channel
+         test-for-io-on-descriptor
          tty-input-channel
          tty-output-channel
          with-channel-blocking)
@@ -2604,7 +2599,11 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   (export (runtime x-graphics)
          have-select?)
   (export (runtime thread)
-         have-select?)
+         add-to-select-registry!
+         have-select?
+         make-select-registry
+         remove-from-select-registry!
+         test-select-registry)
   (export (runtime directory)
          directory-channel/descriptor)
   (initialization (initialize-package!)))
@@ -3957,8 +3956,8 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
          create-thread-continuation
          current-thread
          deregister-all-events
-         deregister-input-descriptor-events
-         deregister-input-thread-event
+         deregister-io-descriptor-events
+         deregister-io-thread-event
          deregister-timer-event
          detach-thread
          exit-current-thread
@@ -3966,8 +3965,8 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
          lock-thread-mutex
          make-thread-mutex
          other-running-threads?
-         permanently-register-input-thread-event
-         register-input-thread-event
+         permanently-register-io-thread-event
+         register-io-thread-event
          register-timer-event
          restart-thread
          set-thread-timer-interval!
@@ -3996,7 +3995,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   (export (runtime interrupt-handler)
          thread-timer-interrupt-handler)
   (export (runtime primitive-io)
-         block-on-input-descriptor)
+         block-on-io-descriptor)
   (export (runtime continuation)
          get-thread-event-block
          set-thread-event-block!)
index 30f0cee2e23a99a46ff834106f20a6cd478c6243..13c8187b8a97424ea78d45f2c4487345c23064f8 100644 (file)
@@ -1,8 +1,9 @@
 #| -*-Scheme-*-
 
-$Id: socket.scm,v 1.19 2002/11/20 19:46:23 cph Exp $
+$Id: socket.scm,v 1.20 2003/01/22 02:05:34 cph Exp $
 
-Copyright (c) 1990-2002 Massachusetts Institute of Technology
+Copyright 1996,1997,1998,1999,2001,2002 Massachusetts Institute of Technology
+Copyright 2003 Massachusetts Institute of Technology
 
 This file is part of MIT Scheme.
 
@@ -92,9 +93,10 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
           (lambda ()
             (let ((do-test
                    (lambda (k)
-                     (let ((result (test-for-input-on-channel server-socket)))
+                     (let ((result
+                            (test-for-io-on-channel server-socket 'READ)))
                        (case result
-                         ((INPUT-AVAILABLE)
+                         ((READ)
                           (open-channel
                            (lambda (p)
                              (with-thread-timer-stopped
index fba9d67220d724cf1755d462d12dc052780eb923..50379cc28c4720a13055a64cd4a77764500c32d8 100644 (file)
@@ -1,8 +1,9 @@
 #| -*-Scheme-*-
 
-$Id: thread.scm,v 1.36 2002/11/20 19:46:23 cph Exp $
+$Id: thread.scm,v 1.37 2003/01/22 02:05:41 cph Exp $
 
-Copyright (c) 1991-1999 Massachusetts Institute of Technology
+Copyright 1991,1992,1993,1998,1999,2001 Massachusetts Institute of Technology
+Copyright 2003 Massachusetts Institute of Technology
 
 This file is part of MIT Scheme.
 
@@ -97,8 +98,8 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   (set! thread-timer-running? #f)
   (set! timer-records #f)
   (set! timer-interval 100)
-  (initialize-input-blocking)
-  (add-event-receiver! event:after-restore initialize-input-blocking)
+  (initialize-io-blocking)
+  (add-event-receiver! event:after-restore initialize-io-blocking)
   (detach-thread (make-thread #f))
   (add-event-receiver! event:before-exit stop-thread-timer))
 
@@ -121,7 +122,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   (map-over-population thread-population (lambda (thread) thread)))
 
 (define (thread-execution-state thread)
-  (guarantee-thread thread thread-execution-state)
+  (guarantee-thread thread 'THREAD-EXECUTION-STATE)
   (thread/execution-state thread))
 
 (define (create-thread root-continuation thunk)
@@ -183,7 +184,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   (thread/next (current-thread)))
 
 (define (thread-continuation thread)
-  (guarantee-thread thread thread-continuation)
+  (guarantee-thread thread 'THREAD-CONTINUATION)
   (without-interrupts
    (lambda ()
      (and (eq? 'WAITING (thread/execution-state thread))
@@ -215,7 +216,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
       (begin
        (set! last-running-thread #f)
        (%maybe-toggle-thread-timer)
-       (wait-for-input))))
+       (wait-for-io))))
 \f
 (define (run-thread thread)
   (let ((continuation (thread/continuation thread)))
@@ -239,7 +240,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     (lambda (thread)
       (let ((block-events? (thread/block-events? thread)))
        (set-thread/block-events?! thread #f)
-       (maybe-signal-input-thread-events)
+       (maybe-signal-io-thread-events)
        (let ((any-events? (handle-thread-events thread)))
          (set-thread/block-events?! thread block-events?)
          (if (not any-events?)
@@ -260,7 +261,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
            (thread-not-running thread 'STOPPED))))))))
 
 (define (restart-thread thread discard-events? event)
-  (guarantee-thread thread restart-thread)
+  (guarantee-thread thread 'RESTART-THREAD)
   (let ((discard-events?
         (if (eq? discard-events? 'ASK)
             (prompt-for-confirmation
@@ -283,7 +284,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 (define (thread-timer-interrupt-handler)
   (set-interrupt-enables! interrupt-mask/gc-ok)
   (deliver-timer-events)
-  (maybe-signal-input-thread-events)
+  (maybe-signal-io-thread-events)
   (let ((thread first-running-thread))
     (cond ((not thread)
           (%maybe-toggle-thread-timer))
@@ -324,7 +325,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     (set-thread/block-events?! thread #t)
     (ring/discard-all (thread/pending-events thread))
     (translate-to-state-point (thread/root-state-point thread))
-    (%deregister-input-thread-events thread #t)
+    (%deregister-io-thread-events thread #t)
     (%discard-thread-timer-records thread)
     (%disassociate-joined-threads thread)
     (%disassociate-thread-mutexes thread)
@@ -333,7 +334,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     (thread-not-running thread 'DEAD)))
 
 (define (join-thread thread event-constructor)
-  (guarantee-thread thread join-thread)
+  (guarantee-thread thread 'JOIN-THREAD)
   (let ((self (current-thread)))
     (if (eq? thread self)
        (signal-thread-deadlock self "join thread" join-thread thread)
@@ -356,7 +357,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                     (event-constructor thread value))))))))))
 
 (define (detach-thread thread)
-  (guarantee-thread thread detach-thread)
+  (guarantee-thread thread 'DETACH-THREAD)
   (without-interrupts
    (lambda ()
      (if (eq? (thread/exit-value thread) detached-thread-marker)
@@ -369,7 +370,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 (define (release-joined-threads thread value)
   (set-thread/exit-value! thread value)
   (do ((joined (thread/joined-threads thread) (cdr joined)))
-      ((null? joined))
+      ((not (pair? joined)))
     (let ((joined (caar joined))
          (event ((cdar joined) thread value)))
       (set-thread/joined-to! joined (delq! thread (thread/joined-to joined)))
@@ -378,19 +379,20 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 (define (%disassociate-joined-threads thread)
   (do ((threads (thread/joined-to thread) (cdr threads)))
-      ((null? threads))
+      ((not (pair? threads)))
     (set-thread/joined-threads!
      (car threads)
      (del-assq! thread (thread/joined-threads (car threads)))))
   (set-thread/joined-to! thread '()))
 \f
-;;;; Input Thread Events
+;;;; I/O Thread Events
 
-(define input-registry)
-(define input-registrations)
+(define io-registry)
+(define io-registrations)
 
 (define-structure (dentry (conc-name dentry/))
   (descriptor #f read-only #t)
+  (mode #f read-only #t)
   first-tentry
   last-tentry
   prev
@@ -405,16 +407,16 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   prev
   next)
 
-(define (initialize-input-blocking)
-  (set! input-registry (and have-select? (make-select-registry)))
-  (set! input-registrations #f)
+(define (initialize-io-blocking)
+  (set! io-registry (and have-select? (make-select-registry)))
+  (set! io-registrations #f)
   unspecific)
 
-(define-integrable (maybe-signal-input-thread-events)
-  (if input-registrations
-      (signal-select-result (select-registry-test input-registry #f))))
+(define (maybe-signal-io-thread-events)
+  (if io-registrations
+      (signal-select-result (test-select-registry io-registry #f))))
 
-(define (wait-for-input)
+(define (wait-for-io)
   (let ((catch-errors
         (lambda (thunk)
           (let ((thread (console-thread)))
@@ -430,7 +432,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                          condition
                          (within-continuation k thunk))
                      thunk))))))))
-    (if (not input-registrations)
+    (if (not io-registrations)
        (begin
          ;; Busy-waiting here is a bad idea -- should implement a
          ;; primitive to block the Scheme process while waiting for a
@@ -443,22 +445,22 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
               (catch-errors
                (lambda ()
                  (set-interrupt-enables! interrupt-mask/all)
-                 (select-registry-test input-registry #t)))))
+                 (test-select-registry io-registry #t)))))
          (set-interrupt-enables! interrupt-mask/gc-ok)
          (signal-select-result result)
          (let ((thread first-running-thread))
            (if thread
                (if (thread/continuation thread)
                    (run-thread thread))
-               (wait-for-input)))))))
+               (wait-for-io)))))))
 
 (define (signal-select-result result)
   (cond ((pair? result)
-        (signal-input-thread-events result))
+        (signal-io-thread-events (car result) (cdr result)))
        ((eq? 'PROCESS-STATUS-CHANGE result)
-        (signal-input-thread-events '(PROCESS-STATUS-CHANGE)))))
+        (signal-io-thread-events '#(1 PROCESS-STATUS-CHANGE) '#(0)))))
 \f
-(define (block-on-input-descriptor descriptor)
+(define (block-on-io-descriptor descriptor mode)
   (without-interrupts
    (lambda ()
      (let ((result 'INTERRUPT)
@@ -468,18 +470,21 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
        (lambda ()
          (let ((thread (current-thread)))
            (set! registration-1
-                 (%register-input-thread-event
+                 (%register-io-thread-event
                   descriptor
+                  mode
                   thread
-                  (lambda ()
-                    (set! result 'INPUT-AVAILABLE)
+                  (lambda (mode)
+                    (set! result mode)
                     unspecific)
                   #f #t))
            (set! registration-2
-                 (%register-input-thread-event
+                 (%register-io-thread-event
                   'PROCESS-STATUS-CHANGE
+                  'READ
                   thread
-                  (lambda ()
+                  (lambda (mode)
+                    mode
                     (set! result 'PROCESS-STATUS-CHANGE)
                     unspecific)
                   #f #t)))
@@ -488,95 +493,98 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
          (%suspend-current-thread)
          result)
        (lambda ()
-         (%deregister-input-thread-event registration-1)
-         (%deregister-input-thread-event registration-2)))))))
+         (%deregister-io-thread-event registration-2)
+         (%deregister-io-thread-event registration-1)))))))
 
-(define (permanently-register-input-thread-event descriptor thread event)
-  (guarantee-thread thread permanently-register-input-thread-event)
+(define (permanently-register-io-thread-event descriptor mode thread event)
+  (guarantee-thread thread 'PERMANENTLY-REGISTER-IO-THREAD-EVENT)
   (without-interrupts
    (lambda ()
-     (%register-input-thread-event descriptor thread event #t #f))))
+     (%register-io-thread-event descriptor mode thread event #t #f))))
 
-(define (register-input-thread-event descriptor thread event)
-  (guarantee-thread thread register-input-thread-event)
+(define (register-io-thread-event descriptor mode thread event)
+  (guarantee-thread thread 'REGISTER-IO-THREAD-EVENT)
   (without-interrupts
    (lambda ()
-     (%register-input-thread-event descriptor thread event #f #f))))
+     (%register-io-thread-event descriptor mode thread event #f #f))))
 
-(define (deregister-input-thread-event tentry)
+(define (deregister-io-thread-event tentry)
   (if (not (tentry? tentry))
-      (error:wrong-type-argument tentry "input thread event registration"
-                                'DEREGISTER-INPUT-THREAD-EVENT))
+      (error:wrong-type-argument tentry "I/O thread event registration"
+                                'DEREGISTER-IO-THREAD-EVENT))
   (without-interrupts
    (lambda ()
-     (%deregister-input-thread-event tentry)
+     (%deregister-io-thread-event tentry)
      (%maybe-toggle-thread-timer))))
 
-(define (deregister-input-descriptor-events descriptor)
+(define (deregister-io-descriptor-events descriptor mode)
   (without-interrupts
    (lambda ()
-     (let loop ((dentry input-registrations))
-       (if dentry
-          (if (eqv? descriptor (dentry/descriptor dentry))
-              (begin
-                (if (not (eq? 'PROCESS-STATUS-CHANGE descriptor))
-                    (remove-from-select-registry! input-registry descriptor))
-                (let ((prev (dentry/prev dentry))
-                      (next (dentry/next dentry)))
-                  (if prev
-                      (set-dentry/next! prev next)
-                      (set! input-registrations next))
-                  (if next
-                      (set-dentry/prev! next prev))))
-              (loop (dentry/next dentry))))))))
+     (let loop ((dentry io-registrations))
+       (cond ((not dentry)
+             unspecific)
+            ((and (eqv? descriptor (dentry/descriptor dentry))
+                  (eq? mode (dentry/mode dentry)))
+             (if (not (eq? 'PROCESS-STATUS-CHANGE descriptor))
+                 (remove-from-select-registry! io-registry descriptor mode))
+             (let ((prev (dentry/prev dentry))
+                   (next (dentry/next dentry)))
+               (if prev
+                   (set-dentry/next! prev next)
+                   (set! io-registrations next))
+               (if next
+                   (set-dentry/prev! next prev))))
+            (else
+             (loop (dentry/next dentry))))))))
 \f
-(define (%register-input-thread-event descriptor thread event
-                                     permanent? front?)
-  (let ((tentry (make-tentry thread event permanent?))
-       (dentry
-        (let loop ((dentry input-registrations))
-          (and dentry
-               (if (eqv? descriptor (dentry/descriptor dentry))
-                   dentry
-                   (loop (dentry/next dentry)))))))
-    (if (not dentry)
-       (let ((dentry (make-dentry descriptor #f #f #f #f)))
-         (set-tentry/dentry! tentry dentry)
-         (set-tentry/prev! tentry #f)
-         (set-tentry/next! tentry #f)
-         (set-dentry/first-tentry! dentry tentry)
-         (set-dentry/last-tentry! dentry tentry)
-         (if input-registrations
-             (set-dentry/prev! input-registrations dentry))
-         (set-dentry/next! dentry input-registrations)
-         (set! input-registrations dentry)
-         (if (not (eq? 'PROCESS-STATUS-CHANGE descriptor))
-             (add-to-select-registry! input-registry descriptor)))
-       (begin
-         (set-tentry/dentry! tentry dentry)
-         (if front?
-             (let ((next (dentry/first-tentry dentry)))
-               (set-tentry/prev! tentry #f)
-               (set-tentry/next! tentry next)
-               (set-dentry/first-tentry! dentry tentry)
-               (set-tentry/prev! next tentry))
-             (let ((prev (dentry/last-tentry dentry)))
-               (set-tentry/prev! tentry prev)
-               (set-tentry/next! tentry #f)
-               (set-dentry/last-tentry! dentry tentry)
-               (set-tentry/next! prev tentry)))))
+(define (%register-io-thread-event descriptor mode thread event permanent?
+                                  front?)
+  (let ((tentry (make-tentry thread event permanent?)))
+    (let loop ((dentry io-registrations))
+      (cond ((not dentry)
+            (let ((dentry
+                   (make-dentry descriptor
+                                mode
+                                tentry
+                                tentry
+                                #f
+                                io-registrations)))
+              (set-tentry/dentry! tentry dentry)
+              (set-tentry/prev! tentry #f)
+              (set-tentry/next! tentry #f)
+              (if io-registrations
+                  (set-dentry/prev! io-registrations dentry))
+              (set! io-registrations dentry)
+              (if (not (eq? 'PROCESS-STATUS-CHANGE descriptor))
+                  (add-to-select-registry! io-registry descriptor mode))))
+           ((and (eqv? descriptor (dentry/descriptor dentry))
+                 (eq? mode (dentry/mode dentry)))
+            (set-tentry/dentry! tentry dentry)
+            (if front?
+                (let ((next (dentry/first-tentry dentry)))
+                  (set-tentry/prev! tentry #f)
+                  (set-tentry/next! tentry next)
+                  (set-dentry/first-tentry! dentry tentry)
+                  (set-tentry/prev! next tentry))
+                (let ((prev (dentry/last-tentry dentry)))
+                  (set-tentry/prev! tentry prev)
+                  (set-tentry/next! tentry #f)
+                  (set-dentry/last-tentry! dentry tentry)
+                  (set-tentry/next! prev tentry))))
+           (else
+            (loop (dentry/next dentry)))))
     (%maybe-toggle-thread-timer)
     tentry))
 
-(define (%deregister-input-thread-event tentry)
+(define (%deregister-io-thread-event tentry)
   (if (tentry/dentry tentry)
       (delete-tentry! tentry)))
 
-(define (%deregister-input-thread-events thread permanent?)
-  (let loop ((dentry input-registrations) (tentries '()))
+(define (%deregister-io-thread-events thread permanent?)
+  (let loop ((dentry io-registrations) (tentries '()))
     (if (not dentry)
        (do ((tentries tentries (cdr tentries)))
-           ((null? tentries))
+           ((not (pair? tentries)))
          (delete-tentry! (car tentries)))
        (loop (dentry/next dentry)
              (let loop
@@ -590,30 +598,44 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                              (cons tentry tentries)
                              tentries))))))))
 \f
-(define (signal-input-thread-events descriptors)
-  (let loop ((dentry input-registrations) (events '()))
-    (cond ((not dentry)
-          (do ((events events (cdr events)))
-              ((null? events))
-            (%signal-thread-event (caar events) (cdar events)))
-          (%maybe-toggle-thread-timer))
-         ((let ((descriptor (dentry/descriptor dentry)))
-            (let loop ((descriptors descriptors))
-              (and (not (null? descriptors))
-                   (or (eqv? descriptor (car descriptors))
-                       (loop (cdr descriptors))))))
-          (let ((next (dentry/next dentry))
-                (tentry (dentry/first-tentry dentry)))
-            (let ((events
-                   (cons (cons (tentry/thread tentry)
-                               (tentry/event tentry))
-                         events)))
-              (if (tentry/permanent? tentry)
-                  (move-tentry-to-back! tentry)
-                  (delete-tentry! tentry))
-              (loop next events))))
-         (else
-          (loop (dentry/next dentry) events)))))
+(define (signal-io-thread-events vr vw)
+  (let ((search
+        (lambda (descriptor v)
+          (let ((n (vector-ref v 0)))
+            (let loop ((i 1))
+              (and (fix:<= i n)
+                   (or (eqv? descriptor (vector-ref v i))
+                       (loop (fix:+ i 1)))))))))
+    (let loop ((dentry io-registrations) (events '()))
+      (if dentry
+         (let ((mode
+                (let ((descriptor (dentry/descriptor dentry))
+                      (mode (dentry/mode dentry)))
+                  (case mode
+                    ((READ) (and (search descriptor vr) 'READ))
+                    ((WRITE) (and (search descriptor vw) 'WRITE))
+                    ((READ/WRITE)
+                     (if (search descriptor vr)
+                         (if (search descriptor vw) 'READ/WRITE 'READ)
+                         (if (search descriptor vw) 'WRITE #f)))
+                    (else #f)))))
+           (if mode
+               (let ((next (dentry/next dentry))
+                     (tentry (dentry/first-tentry dentry)))
+                 (let ((events
+                        (cons (cons (tentry/thread tentry)
+                                    (let ((e (tentry/event tentry)))
+                                      (and e
+                                           (lambda () (e mode)))))
+                              events)))
+                   (if (tentry/permanent? tentry)
+                       (move-tentry-to-back! tentry)
+                       (delete-tentry! tentry))
+                   (loop next events)))
+               (loop (dentry/next dentry) events)))
+         (do ((events events (cdr events)))
+             ((not (pair? events)))
+           (%signal-thread-event (caar events) (cdar events)))))))
 
 (define (move-tentry-to-back! tentry)
   (let ((next (tentry/next tentry)))
@@ -645,15 +667,16 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
        (begin
          (let ((descriptor (dentry/descriptor dentry)))
            (if (not (eq? 'PROCESS-STATUS-CHANGE descriptor))
-               (remove-from-select-registry! input-registry descriptor)))
+               (remove-from-select-registry! io-registry
+                                             descriptor
+                                             (dentry/mode dentry))))
          (let ((prev (dentry/prev dentry))
                (next (dentry/next dentry)))
            (if prev
                (set-dentry/next! prev next)
-               (set! input-registrations next))
+               (set! io-registrations next))
            (if next
-               (set-dentry/prev! next prev))))))
-  unspecific)
+               (set-dentry/prev! next prev)))))))
 \f
 ;;;; Events
 
@@ -716,7 +739,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
      unspecific)))
 \f
 (define (signal-thread-event thread event)
-  (guarantee-thread thread signal-thread-event)
+  (guarantee-thread thread 'SIGNAL-THREAD-EVENT)
   (let ((self first-running-thread))
     (if (eq? thread self)
        (let ((block-events? (block-thread-events)))
@@ -761,12 +784,12 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
           (let ((block-events? (thread/block-events? thread)))
             (set-thread/block-events?! thread #f)
             (deliver-timer-events)
-            (maybe-signal-input-thread-events)
+            (maybe-signal-io-thread-events)
             (handle-thread-events thread)
             (set-thread/block-events?! thread block-events?))
           (begin
             (deliver-timer-events)
-            (maybe-signal-input-thread-events)))))))
+            (maybe-signal-io-thread-events)))))))
 \f
 ;;;; Timer Events
 
@@ -842,7 +865,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     (let ((block-events? (thread/block-events? thread)))
       (set-thread/block-events?! thread #t)
       (ring/discard-all (thread/pending-events thread))
-      (%deregister-input-thread-events thread #f)
+      (%deregister-io-thread-events thread #f)
       (%discard-thread-timer-records thread)
       (set-thread/block-events?! thread block-events?))
     (set-interrupt-enables! interrupt-mask/all)))
@@ -883,7 +906,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 (define (%maybe-toggle-thread-timer)
   (cond ((and timer-interval
-             (or input-registrations
+             (or io-registrations
                  (let ((current-thread first-running-thread))
                    (and current-thread
                         (thread/next current-thread)))))
@@ -937,11 +960,11 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
       (error:wrong-type-argument mutex "thread-mutex" procedure)))
 
 (define (thread-mutex-owner mutex)
-  (guarantee-thread-mutex mutex thread-mutex-owner)
+  (guarantee-thread-mutex mutex 'THREAD-MUTEX-OWNER)
   (thread-mutex/owner mutex))
 
 (define (lock-thread-mutex mutex)
-  (guarantee-thread-mutex mutex lock-thread-mutex)
+  (guarantee-thread-mutex mutex 'LOCK-THREAD-MUTEX)
   (without-interrupts
    (lambda ()
      (let ((thread (current-thread))
@@ -961,7 +984,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
       (set-thread-mutex/owner! mutex thread)))
 
 (define (unlock-thread-mutex mutex)
-  (guarantee-thread-mutex mutex unlock-thread-mutex)
+  (guarantee-thread-mutex mutex 'UNLOCK-THREAD-MUTEX)
   (without-interrupts
    (lambda ()
      (let ((owner (thread-mutex/owner mutex)))
@@ -981,7 +1004,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     thread))
 \f
 (define (try-lock-thread-mutex mutex)
-  (guarantee-thread-mutex mutex try-lock-thread-mutex)
+  (guarantee-thread-mutex mutex 'TRY-LOCK-THREAD-MUTEX)
   (without-interrupts
    (lambda ()
      (and (not (thread-mutex/owner mutex))
@@ -991,7 +1014,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
            #t)))))
 
 (define (with-thread-mutex-locked mutex thunk)
-  (guarantee-thread-mutex mutex lock-thread-mutex)
+  (guarantee-thread-mutex mutex 'WITH-THREAD-MUTEX-LOCKED)
   (let ((thread (current-thread))
        (grabbed-lock?))
     (dynamic-wind
@@ -1011,7 +1034,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 (define (%disassociate-thread-mutexes thread)
   (do ((mutexes (thread/mutexes thread) (cdr mutexes)))
-      ((null? mutexes))
+      ((not (pair? mutexes)))
     (let ((mutex (car mutexes)))
       (if (eq? (thread-mutex/owner mutex) thread)
          (%%unlock-thread-mutex mutex)
index 3b017d3c7a273108ab6f9e478d55737abf79c5c7..66efd26707222cf007979b1b478ede5d3416f56d 100644 (file)
@@ -1,8 +1,10 @@
 #| -*-Scheme-*-
 
-$Id: unxprm.scm,v 1.63 2002/11/20 19:46:24 cph Exp $
+$Id: unxprm.scm,v 1.64 2003/01/22 02:05:47 cph Exp $
 
-Copyright (c) 1988-2001 Massachusetts Institute of Technology
+Copyright 1988,1989,1990,1991,1992,1993 Massachusetts Institute of Technology
+Copyright 1994,1995,1997,1998,1999,2000 Massachusetts Institute of Technology
+Copyright 2001,2003 Massachusetts Institute of Technology
 
 This file is part of MIT Scheme.
 
@@ -185,8 +187,10 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
          (set-environment-variable! variable *variable-deleted*)))
 
   (set! reset-environment-variables!
-       (lambda () (set! environment-variables '())))
-) ; End LET
+       (lambda () (set! environment-variables '()))))
+
+(define (initialize-system-primitives!)
+  (add-event-receiver! event:after-restart reset-environment-variables!))
 \f
 (define (user-home-directory user-name)
   (let ((directory ((ucode-primitive get-user-home-directory 1) user-name)))
@@ -330,102 +334,6 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                                            specifier)))
                   (user-homedir-pathname)))
 \f
-;;; Queues after-restart daemon to clean up environment space
-
-(define (initialize-system-primitives!)
-  (add-event-receiver! event:after-restart reset-environment-variables!)
-  (discard-select-registry-result-vectors!)
-  (add-event-receiver! event:after-restart
-                      discard-select-registry-result-vectors!))
-
-(define (make-select-registry . descriptors)
-  (let ((registry (make-string ((ucode-primitive select-registry-size 0)))))
-    ((ucode-primitive select-registry-clear-all 1) registry)
-    (do ((descriptors descriptors (cdr descriptors)))
-       ((not (pair? descriptors)))
-      ((ucode-primitive select-registry-set 2) registry (car descriptors)))
-    registry))
-
-(define (add-to-select-registry! registry descriptor)
-  ((ucode-primitive select-registry-set 2) registry descriptor))
-
-(define (remove-from-select-registry! registry descriptor)
-  ((ucode-primitive select-registry-clear 2) registry descriptor))
-
-(define (select-descriptor descriptor block?)
-  (let ((result ((ucode-primitive select-descriptor 2) descriptor block?)))
-    (case result
-      ((0)
-       #f)
-      ((1)
-       'INPUT-AVAILABLE)
-      ((-1)
-       (subprocess-global-status-tick)
-       'PROCESS-STATUS-CHANGE)
-      ((-2)
-       'INTERRUPT)
-      (else
-       (error "Illegal result from CHANNEL-SELECT:" result)))))
-\f
-(define (select-registry-test registry block?)
-  (let ((result-vector (allocate-select-registry-result-vector)))
-    (let ((result
-          ((ucode-primitive select-registry-test 3) registry block?
-                                                    result-vector)))
-      (if (fix:> result 0)
-         (let loop ((index (fix:- result 1)) (descriptors '()))
-           (let ((descriptors
-                  (cons (vector-ref result-vector index) descriptors)))
-             (if (fix:= 0 index)
-                 (begin
-                   (deallocate-select-registry-result-vector result-vector)
-                   descriptors)
-                 (loop (fix:- index 1) descriptors))))
-         (begin
-           (deallocate-select-registry-result-vector result-vector)
-           (cond ((fix:= 0 result)
-                  #f)
-                 ((fix:= -1 result)
-                  (subprocess-global-status-tick)
-                  'PROCESS-STATUS-CHANGE)
-                 ((fix:= -2 result)
-                  'INTERRUPT)
-                 (else
-                  (error "Illegal result from SELECT-REGISTRY-TEST:"
-                         result))))))))
-
-(define select-registry-result-vectors)
-
-(define (discard-select-registry-result-vectors!)
-  (set! select-registry-result-vectors '())
-  unspecific)
-
-(define (allocate-select-registry-result-vector)
-  (let ((interrupt-mask (set-interrupt-enables! interrupt-mask/gc-ok)))
-    (let ((v
-          (let loop ((rv select-registry-result-vectors))
-            (if (pair? rv)
-                (let ((v (car rv)))
-                  (if v
-                      (begin
-                        (set-car! rv #f)
-                        v)
-                      (loop (cdr rv))))
-                (make-vector ((ucode-primitive select-registry-lub 0)) #f)))))
-      (set-interrupt-enables! interrupt-mask)
-      v)))
-
-(define (deallocate-select-registry-result-vector v)
-  (let ((interrupt-mask (set-interrupt-enables! interrupt-mask/gc-ok)))
-    (let loop ((rv select-registry-result-vectors))
-      (if (pair? rv)
-         (if (car rv)
-             (loop (cdr rv))
-             (set-car! rv v))
-         (set! select-registry-result-vectors
-               (cons v select-registry-result-vectors))))
-    (set-interrupt-enables! interrupt-mask)))
-\f
 ;;;; Subprocess/Shell Support
 
 (define (os/make-subprocess filename arguments environment working-directory
index a3a2d66de7f3a2240a3e8f1e7861a21be0711131..14ade2c51857a633a51d89f0fc4c55312087edc2 100644 (file)
@@ -1,8 +1,10 @@
 #| -*-Scheme-*-
 
-$Id: version.scm,v 14.210 2002/11/20 19:46:24 cph Exp $
+$Id: version.scm,v 14.211 2003/01/22 02:05:54 cph Exp $
 
-Copyright (c) 1988-2002 Massachusetts Institute of Technology
+Copyright 1988,1989,1990,1991,1992,1993 Massachusetts Institute of Technology
+Copyright 1995,1996,1997,1998,1999,2000 Massachusetts Institute of Technology
+Copyright 2001,2002,2003 Massachusetts Institute of Technology
 
 This file is part of MIT Scheme.
 
@@ -31,7 +33,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   (add-subsystem-identification! "Release" '(7 7 2 "pre"))
   (snarf-microcode-version!)
   (add-event-receiver! event:after-restore snarf-microcode-version!)
-  (add-subsystem-identification! "Runtime" '(15 2)))
+  (add-subsystem-identification! "Runtime" '(15 3)))
 
 (define (snarf-microcode-version!)
   (add-subsystem-identification! "Microcode"
index aea6d7a1db84cfb351ae0e8de22a5a9759168763..d3cb5a4f3a1f224139b28e2a75cd0e7b3cc2f6c5 100644 (file)
@@ -1,8 +1,10 @@
 #| -*-Scheme-*-
 
-$Id: x11graph.scm,v 1.53 2002/11/20 19:46:24 cph Exp $
+$Id: x11graph.scm,v 1.54 2003/01/22 02:06:00 cph Exp $
 
-Copyright (c) 1989-2002 Massachusetts Institute of Technology
+Copyright 1989,1990,1991,1992,1993,1995 Massachusetts Institute of Technology
+Copyright 1996,1997,1998,1999,2000,2001 Massachusetts Institute of Technology
+Copyright 2002,2003 Massachusetts Institute of Technology
 
 This file is part of MIT Scheme.
 
@@ -265,10 +267,12 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 (define (make-event-previewer display)
   (let ((registration))
     (set! registration
-         (permanently-register-input-thread-event
+         (permanently-register-io-thread-event
           (x-display-descriptor (x-display/xd display))
+          'READ
           (current-thread)
-          (lambda ()
+          (lambda (mode)
+            mode
             (call-with-current-continuation
              (lambda (continuation)
                (bind-condition-handler
@@ -280,7 +284,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                      ;; on its display argument, that means the
                      ;; display has been closed.
                      condition
-                     (deregister-input-thread-event registration)
+                     (deregister-io-thread-event registration)
                      (continuation unspecific))
                  (lambda ()
                    (let ((event
@@ -303,10 +307,11 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 (define (%read-and-process-event display)
   (let ((event
-        (and (eq? 'INPUT-AVAILABLE
-                  (test-for-input-on-descriptor
+        (and (eq? 'READ
+                  (test-for-io-on-descriptor
                    (x-display-descriptor (x-display/xd display))
-                   #t))
+                   #t
+                   'READ))
              (x-display-process-events (x-display/xd display) 1))))
     (if event
        (process-event display event))))
index e93c43443ae19e029e2856cca5f733764d46935a..e1b3b129d60c905dde3db188e20bb9c39aad0e9c 100644 (file)
@@ -317,9 +317,13 @@ end of debugging stuff
          (if (and code (not (scxl-destroyed? (weak-car wcdr))))
              (begin
                ;; Reinstall interrupt handler, then run user code
-               (register-input-thread-event
+               (register-io-thread-event
                 (XConnectionNumber (weak-car wcdr))
-                uitk-thread (weak-cdr wcdr))
+                'READ
+                uitk-thread
+                (lambda (mode)
+                  mode
+                  ((weak-cdr wcdr))))
                (code))))))
     (define (call-if-still-there weak)
       ;; WEAK is a weak-list:
@@ -346,15 +350,20 @@ end of debugging stuff
            (weak (weak-cons child-work-code (weak-cons display #F))))
        (without-interrupts
         (lambda ()
-          (register-input-thread-event
-           file uitk-thread (call-if-still-there weak))))))))
+          (register-io-thread-event
+           file
+           'READ
+           uitk-thread
+           (lambda (mode)
+             mode
+             (call-if-still-there weak)))))))))
 
 (define (destroy-registration registration)
-  (deregister-input-thread-event registration)
+  (deregister-io-thread-event registration)
   'OK)
 
 (define (shut-down-event-server display-number)
-  (deregister-input-descriptor-events (%XConnectionNumber display-number)))
+  (deregister-io-descriptor-events (%XConnectionNumber display-number) 'READ))
 \f
 
 ;;;Delayed events