[usocket-cvs] r308 - in usocket/trunk: . backend
ehuelsmann at common-lisp.net
ehuelsmann at common-lisp.net
Sat Feb 16 10:16:53 UTC 2008
Author: ehuelsmann
Date: Sat Feb 16 05:16:50 2008
New Revision: 308
Modified:
usocket/trunk/backend/sbcl.lisp
usocket/trunk/usocket.lisp
Log:
Don't loop over the sockets if we timed out...
Modified: usocket/trunk/backend/sbcl.lisp
==============================================================================
--- usocket/trunk/backend/sbcl.lisp (original)
+++ usocket/trunk/backend/sbcl.lisp Sat Feb 16 05:16:50 2008
@@ -286,19 +286,19 @@
:key #'sb-bsd-sockets:socket-file-descriptor))
(sb-alien:addr rfds) nil nil
(when timeout secs) musecs)))
- (if (=> count 0)
- ;; process the result...
- (remove-if
- #'(lambda (x)
- (not (sb-unix:fd-isset
- (sb-bsd-sockets:socket-file-descriptor (socket x))
- rfds)))
- sockets)
- (let ((err (sb-alien:get-errno)))
- (unless (= err sb-unix:EINTR)
- (error (map-errno-error err))))
- ;;###FIXME generate an error, except for EINTR
- ))))))
+ (unless (= 0 count) ;; 0 means timeout
+ (if (=> count 0)
+ ;; process the result...
+ (remove-if
+ #'(lambda (x)
+ (not
+ (sb-unix:fd-isset
+ (sb-bsd-sockets:socket-file-descriptor (socket x))
+ rfds)))
+ sockets)
+ (let ((err (sb-alien:get-errno)))
+ (unless (= err sb-unix:EINTR)
+ (error (map-errno-error err)))))))))))
#+win32
(warn "wait-for-input not (yet!) supported...")
Modified: usocket/trunk/usocket.lisp
==============================================================================
--- usocket/trunk/usocket.lisp (original)
+++ usocket/trunk/usocket.lisp Sat Feb 16 05:16:50 2008
@@ -198,15 +198,23 @@
(defmethod wait-for-input (socket-or-sockets &key timeout)
(let* ((start (get-internal-real-time))
+ (sockets (if (listp socket-or-sockets)
+ socket-or-sockets
+ (list socket-or-sockets)))
+ ;; retrieve a list of all sockets which are ready without waiting
+ (ready-sockets
+ (remove-if (complement #'(lambda (x)
+ (and (stream-usocket-p x)
+ (listen (socket-stream x)))))
+ sockets))
;; the internal routine is responsibe for
;; making sure the wait doesn't block on socket-streams of
;; which the socket isn't ready, but there's space left in the
;; buffer
(result (wait-for-input-internal
- (if (listp socket-or-sockets) socket-or-sockets
- (list socket-or-sockets))
- :timeout timeout)))
- (values result
+ sockets
+ :timeout (if (null ready-sockets) timeout 0))))
+ (values (union ready-sockets result)
(when timeout
(let ((elapsed (/ (- (get-internal-real-time) start)
internal-time-units-per-second)))
More information about the usocket-cvs
mailing list