[usocket-cvs] r659 - usocket/branches/0.5.x/backend
Chun Tian (binghe)
ctian at common-lisp.net
Wed May 11 11:47:42 UTC 2011
Author: ctian
Date: Wed May 11 07:47:42 2011
New Revision: 659
Log:
[ECL] More fixes for issue elliott-slaughter.2; slightly optimize on SBCL's W-F-I when timeout happens.
Modified:
usocket/branches/0.5.x/backend/sbcl.lisp
Modified: usocket/branches/0.5.x/backend/sbcl.lisp
==============================================================================
--- usocket/branches/0.5.x/backend/sbcl.lisp (original)
+++ usocket/branches/0.5.x/backend/sbcl.lisp Wed May 11 07:47:42 2011
@@ -594,8 +594,9 @@
(let ((rv (wsa-wait-for-multiple-events 1 (wait-list-%wait wait-list)
nil (truncate (* 1000 timeout)) nil)))
(ecase rv
- ((#.+wsa-wait-event-0+ #.+wsa-wait-timeout+)
+ ((#.+wsa-wait-event-0+)
(update-ready-and-state-slots (wait-list-waiters wait-list)))
+ ((#.+wsa-wait-timeout+)) ; do nothing here
((#.+wsa-wait-failed+)
(raise-usock-err
(sb-win32::get-last-error-message (sb-win32::get-last-error))
@@ -762,19 +763,25 @@
(stream-usocket (logior fd-read))
(datagram-usocket (logior fd-read)))))
;; TODO: check the iErrorCode array
- (if (ffi:c-inline ((socket-handle socket) events) (:fixnum :fixnum) :bool
- "WSANETWORKEVENTS network_events;
- int i, result;
- result = WSAEnumNetworkEvents((SOCKET)#0, 0, &network_events);
- if (!result) {
- @(return) = (#1 & network_events.lNetworkEvents)? Ct : Cnil;
- } else
- @(return) = Cnil;")
- (progn
- (setf (state socket) :READ)
- (when (stream-server-usocket-p socket)
- (setf (%ready-p socket) t)))
- (sb-bsd-sockets::socket-error 'update-ready-and-state-slots))))))
+ (multiple-value-bind (valid-p ready-p)
+ (ffi:c-inline ((socket-handle socket) events) (:fixnum :fixnum)
+ (values :bool :bool)
+ "WSANETWORKEVENTS network_events;
+ int i, result;
+ result = WSAEnumNetworkEvents((SOCKET)#0, 0, &network_events);
+ if (!result) {
+ @(return 0) = Ct;
+ @(return 1) = (#1 & network_events.lNetworkEvents)? Ct : Cnil;
+ } else {
+ @(return 0) = Cnil;
+ @(return 1) = Cnil;
+ }")
+ (if valid-p
+ (when ready-p
+ (setf (state socket) :READ)
+ (when (stream-server-usocket-p socket)
+ (setf (%ready-p socket) t)))
+ (sb-bsd-sockets::socket-error 'update-ready-and-state-slots)))))))
(defun wait-for-input-internal (wait-list &key timeout)
(when (waiting-required (wait-list-waiters wait-list))
@@ -786,8 +793,9 @@
result = WSAWaitForMultipleEvents(1, events, NULL, #1, NULL);
@(return) = result;")))
(ecase rv
- ((#.+wsa-wait-event-0+ #.+wsa-wait-timeout+)
+ ((#.+wsa-wait-event-0+)
(update-ready-and-state-slots (wait-list-waiters wait-list)))
+ ((#.+wsa-wait-timeout+)) ; do nothing here
((#.+wsa-wait-failed+)
(sb-bsd-sockets::socket-error 'wait-for-input-internal))))))
More information about the usocket-cvs
mailing list