[usocket-cvs] r665 - in usocket/branches/0.5.x: . backend
ctian at common-lisp.net
ctian at common-lisp.net
Sun Jun 26 15:55:53 UTC 2011
Author: ctian
Date: Sun Jun 26 08:55:52 2011
New Revision: 665
Log:
[MCL] Fixed WAIT-FOR-INPUT on passive sockets (stream-server-usocket)
Modified:
usocket/branches/0.5.x/CHANGES
usocket/branches/0.5.x/backend/mcl.lisp
Modified: usocket/branches/0.5.x/CHANGES
==============================================================================
--- usocket/branches/0.5.x/CHANGES Sat Jun 25 18:15:16 2011 (r664)
+++ usocket/branches/0.5.x/CHANGES Sun Jun 26 08:55:52 2011 (r665)
@@ -1,6 +1,7 @@
0.5.3:
-* [MCL] fixed SOCKET-LISTEN on vector addresses like #(0 0 0 0)
+* [MCL] Fixed SOCKET-LISTEN on vector addresses like #(0 0 0 0)
+* [MCL] Fixed WAIT-FOR-INPUT on passive sockets (stream-server-usocket)
0.5.2:
Modified: usocket/branches/0.5.x/backend/mcl.lisp
==============================================================================
--- usocket/branches/0.5.x/backend/mcl.lisp Sat Jun 25 18:15:16 2011 (r664)
+++ usocket/branches/0.5.x/backend/mcl.lisp Sun Jun 26 08:55:52 2011 (r665)
@@ -230,7 +230,7 @@
(declare (special ccl::*passive-interface-address*))
new))
-(defun input-available-p (stream)
+(defmethod input-available-p ((stream ccl::opentransport-stream))
(macrolet ((when-io-buffer-lock-grabbed ((lock &optional multiple-value-p) &body body)
"Evaluates the body if and only if the lock is successfully grabbed"
;; like with-io-buffer-lock-grabbed but returns immediately instead of polling the lock
@@ -257,19 +257,21 @@
(when-io-buffer-lock-grabbed ((ccl::io-buffer-lock io-buffer))
(funcall (ccl::io-buffer-listen-function io-buffer) stream io-buffer))))))))
-(defparameter *passive-polling-delay* 1/60)
+(defmethod connection-established-p ((stream ccl::opentransport-stream))
+ (ccl::with-io-buffer-locked ((ccl::stream-io-buffer stream nil))
+ (let ((state (ccl::opentransport-stream-connection-state stream)))
+ (not (eq :unbnd state)))))
(defun wait-for-input-internal (wait-list &key timeout &aux result)
(labels ((ready-sockets (sockets)
- (or (dolist (sock sockets result)
- (when (cond ((stream-usocket-p sock)
- (input-available-p (socket-stream sock)))
- ((stream-server-usocket-p sock)
- (input-available-p (car (socket-streams (socket sock))))))
- (push sock result)))
- (unless (and timeout (zerop timeout))
- (sleep *passive-polling-delay*)
- NIL))))
+ (dolist (sock sockets result)
+ (when (cond ((stream-usocket-p sock)
+ (input-available-p (socket-stream sock)))
+ ((stream-server-usocket-p sock)
+ (let ((ot-stream (first (socket-streams (socket sock)))))
+ (or (input-available-p ot-stream)
+ (connection-established-p ot-stream)))))
+ (push sock result)))))
(with-mapped-conditions ()
(ccl:process-wait-with-timeout
"socket input"
More information about the usocket-cvs
mailing list