[Openmcl-cvs-notifications] r11831 - /release/1.3/source/level-1/l1-streams.lisp

gb at clozure.com gb at clozure.com
Fri Mar 20 07:01:03 EDT 2009


Author: gb
Date: Fri Mar 20 07:01:03 2009
New Revision: 11831

Log:
r11827 (Windows I/O timeouts) to 1.3.

Modified:
    release/1.3/source/level-1/l1-streams.lisp

Modified: release/1.3/source/level-1/l1-streams.lisp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- release/1.3/source/level-1/l1-streams.lisp (original)
+++ release/1.3/source/level-1/l1-streams.lisp Fri Mar 20 07:01:03 2009
@@ -5367,8 +5367,29 @@
 	      (pref tv :timeval.tv_usec) us)))))
 =

 (defun fd-input-available-p (fd &optional milliseconds)
-  #+windows-target (declare (ignore fd milliseconds))
-  #+windows-target nil
+  #+windows-target
+  (case (%unix-fd-kind fd)
+    (:socket
+     (rlet ((infds #>fd_set)
+            (tv :timeval :tv_sec 0 :tv_usec 0))
+       (fd-zero infds)
+       (fd-set fd infds)
+       (when milliseconds
+         (multiple-value-bind (seconds millis)
+             (floor milliseconds 1000)
+        (setf (pref tv :timeval.tv_sec) seconds
+              (pref tv :timeval.tv_usec) (* 1000 millis))))
+       (let* ((result (#_select 1 infds (%null-ptr) (%null-ptr) (if millis=
econds tv (%null-ptr)))))
+         (cond ((> result 0) (values t 0))
+               ((=3D result 0) (values nil 0))
+               (t (values nil (- (#_GetLastError))))))))
+    (:pipe (if (data-available-on-pipe-p fd)
+             (values t 0)
+             (if (and milliseconds (> milliseconds 0))
+               (values (process-wait-with-timeout "input-wait" millisecond=
s #'data-available-on-pipe-p fd) 0)
+               (values nil 0))))
+    ;(:character-special (windows-tty-input-available-p fd milliseconds))
+    (t (values nil 0)))
   #-windows-target
   (rlet ((pollfds (:array (:struct :pollfd) 1)))
     (setf (pref (paref pollfds (:* (:struct :pollfd)) 0) :pollfd.fd) fd
@@ -5379,8 +5400,23 @@
 =

 =

 (defun fd-ready-for-output-p (fd &optional milliseconds)
-  #+windows-target (declare (ignore fd milliseconds))
-  #+windows-target t
+  #+windows-target
+  (case (%unix-fd-kind fd)
+    (:socket
+     (rlet ((tv :timeval :tv_sec 0 :tv_usec 0)
+            (outfds :fd_set))
+       (fd-zero outfds)
+       (fd-set fd outfds)
+       (when milliseconds
+         (multiple-value-bind (seconds millis)
+             (floor milliseconds 1000)
+           (setf (pref tv #>timeval.tv_sec) seconds
+                 (pref tv #>timeval.tv_usec) (* millis 1000))))
+       (let* ((res (#_select 1 (%null-ptr) outfds (%null-ptr) (if millisec=
onds tv (%null-ptr)))))
+         (cond ((> res 0) (values t 0))
+               ((=3D res 0) (values nil 0))
+               (t (values 0 (- (#_GetLastError))))))))
+    (t (values t 0)))
   #-windows-target
   (rlet ((pollfds (:array (:struct :pollfd) 1)))
     (setf (pref (paref pollfds (:* (:struct :pollfd)) 0) :pollfd.fd) fd



More information about the Openmcl-cvs-notifications mailing list