[usocket-cvs] r664 - usocket/branches/0.5.x/backend
ctian at common-lisp.net
ctian at common-lisp.net
Sun Jun 26 01:15:18 UTC 2011
Author: ctian
Date: Sat Jun 25 18:15:16 2011
New Revision: 664
Log:
[mcl] separated input-available-p from wait-for-input-internel; add polling delay to prevent 100% CPU payload as suggest by Terje
Modified:
usocket/branches/0.5.x/backend/mcl.lisp
Modified: usocket/branches/0.5.x/backend/mcl.lisp
==============================================================================
--- usocket/branches/0.5.x/backend/mcl.lisp Sat Jun 25 00:02:05 2011 (r663)
+++ usocket/branches/0.5.x/backend/mcl.lisp Sat Jun 25 18:15:16 2011 (r664)
@@ -230,8 +230,7 @@
(declare (special ccl::*passive-interface-address*))
new))
-
-(defun wait-for-input-internal (wait-list &key timeout &aux result)
+(defun input-available-p (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
@@ -249,23 +248,32 @@
(declare (type ccl::lock lock))
;; crucial - clears bogus lock.value as in grab-io-buffer-lock-out-of-line:
(ccl::%io-buffer-lock-really-grabbed-p lock)
- (ccl:store-conditional lock nil ccl:*current-process*))
- (input-available (stream)
- "similar to stream-listen on buffered-input-stream-mixin but without waiting for lock"
- (let ((io-buffer (ccl::stream-io-buffer stream)))
- (or (not (eql 0 (ccl::io-buffer-incount io-buffer)))
- (ccl::io-buffer-untyi-char io-buffer)
- (locally (declare (optimize (speed 3) (safety 0)))
- (when-io-buffer-lock-grabbed ((ccl::io-buffer-lock io-buffer))
- (funcall (ccl::io-buffer-listen-function io-buffer) stream io-buffer))))))
- (ready-sockets (sockets)
- (dolist (sock sockets result)
- (when (input-available (socket-stream sock))
- (push sock result)))))
- (with-mapped-conditions ()
- (ccl:process-wait-with-timeout
- "socket input"
- (when timeout (truncate (* timeout 60)))
- #'ready-sockets
- (wait-list-waiters wait-list)))
- (nreverse result))))
+ (ccl:store-conditional lock nil ccl:*current-process*)))
+ "similar to stream-listen on buffered-input-stream-mixin but without waiting for lock"
+ (let ((io-buffer (ccl::stream-io-buffer stream)))
+ (or (not (eql 0 (ccl::io-buffer-incount io-buffer)))
+ (ccl::io-buffer-untyi-char io-buffer)
+ (locally (declare (optimize (speed 3) (safety 0)))
+ (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)
+
+(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))))
+ (with-mapped-conditions ()
+ (ccl:process-wait-with-timeout
+ "socket input"
+ (when timeout (truncate (* timeout 60)))
+ #'ready-sockets
+ (wait-list-waiters wait-list)))
+ (nreverse result)))
More information about the usocket-cvs
mailing list