Hi, Chaitanya
I found the implementation of SB-UNIX:UNIX-FAST-SELECT in SBCL source tree (src/code/unix.lisp)
;;; Perform the UNIX select(2) system call. (declaim (inline unix-fast-select)) (defun unix-fast-select (num-descriptors read-fds write-fds exception-fds timeout-secs timeout-usecs) (declare (type (integer 0 #.fd-setsize) num-descriptors) (type (or (alien (* (struct fd-set))) null) read-fds write-fds exception-fds) (type (or null (unsigned-byte 31)) timeout-secs timeout- usecs)) (flet ((select (tv-sap) (int-syscall ("select" int (* (struct fd-set)) (* (struct fd-set)) (* (struct fd-set)) (* (struct timeval))) num-descriptors read-fds write-fds exception- fds tv-sap))) (cond ((or timeout-secs timeout-usecs) (with-alien ((tv (struct timeval))) (setf (slot tv 'tv-sec) (or timeout-secs 0)) (setf (slot tv 'tv-usec) (or timeout-usecs 0)) (select (alien-sap (addr tv))))) (t (unless *interrupts-enabled* (note-dangerous-select)) (select (int-sap 0))))))
And the Book "UNIX Network Programming Vol 1 (2nd edition)" said about select() (p. 150):
"Wait forever: return only when one of the specified descriptors is ready for I/O. For this, we specify the /timeout/ argument as a null pointer."
So, to make UNIX-FAST-SELECT wait for ever, both TIMEOUT-SECS and TIMEOUT-USECS must be NIL. I think your patch is right, that's a usocket bug.
Commited to trunk as r483, thanks very much!
--binghe
On 2008-12-24, at 01:13, Chaitanya Gupta wrote:
Hi,
On SBCL, providing :timeout NIL to wait-for-input returns immediately even when there is no input on any of the provided sockets (the documentation says it should wait indefinitely).
Attached is a patch (svn diff) which fixes this, but I am not very sure about how sb-unix:unix-fast-select works, so its be best if someone who knows better can review it before committing this patch. :)
Cheers, Chaitanya
Index: backend/sbcl.lisp
--- backend/sbcl.lisp (revision 482) +++ backend/sbcl.lisp (working copy) @@ -353,7 +353,7 @@ (1+ (reduce #'max (wait-list-%wait sockets) :key #'sb-bsd-sockets:socket-file- descriptor)) (sb-alien:addr rfds) nil nil
(when timeout secs) musecs)
(unless (= err sb-unix:EINTR) (error (map-errno-error err)))(when timeout secs) (when timeout musecs)) (if (null count)
usocket-devel mailing list usocket-devel@common-lisp.net http://common-lisp.net/cgi-bin/mailman/listinfo/usocket-devel
-- Chun Tian (binghe) NetEase.com, Inc. P. R. China