The attached patch handles EAGAIN in I/O operations the same way as EWOULDBLOCK (it reschedules the operation). Before, EAGAIN was treated as an error. This may be a possible fix for part of the problems reported in #858.
cheers, felix
>From e007540f8e521618411e850569d21f6a48531ed4 Mon Sep 17 00:00:00 2001 From: felix <fe...@call-with-current-continuation.org> Date: Tue, 12 Jun 2012 10:01:41 +0200 Subject: [PATCH] handle EAGAIN in I/O operations --- posixunix.scm | 10 ++++++---- tcp.scm | 8 ++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/posixunix.scm b/posixunix.scm index 76a0349..1839061 100644 --- a/posixunix.scm +++ b/posixunix.scm @@ -1294,7 +1294,8 @@ EOF (lambda () (let ((res (##sys#file-select-one fd))) (if (fx= -1 res) - (if (fx= _errno _ewouldblock) + (if (or (fx= _errno _ewouldblock) + (rx= _errno _eagain)) #f (posix-error #:file-error loc "cannot select" fd nam)) (fx= 1 res))))] @@ -1310,7 +1311,7 @@ EOF (let ([cnt (##core#inline "C_read" fd buf bufsiz)]) (cond ((fx= cnt -1) (select _errno - ((_ewouldblock) + ((_ewouldblock _egain) (##sys#thread-block-for-i/o! ##sys#current-thread fd #:input) (##sys#thread-yield!) (loop) ) @@ -1326,7 +1327,8 @@ EOF (loop) ) (let ([cnt (##core#inline "C_read" fd buf bufsiz)]) (when (fx= cnt -1) - (if (fx= _errno _ewouldblock) + (if (or (fx= _errno _ewouldblock) + (fx= _errno _eagain)) (set! cnt 0) (posix-error #:file-error loc "cannot read" fd nam) ) ) (set! buflen cnt) @@ -1423,7 +1425,7 @@ EOF (let ([cnt (##core#inline "C_write" fd str len)]) (cond ((fx= -1 cnt) (select _errno - ((_ewouldblock) + ((_ewouldblock _eagain) (##sys#thread-yield!) (poke str len) ) ((_eintr) diff --git a/tcp.scm b/tcp.scm index 0d49c22..b9cbec1 100644 --- a/tcp.scm +++ b/tcp.scm @@ -45,6 +45,7 @@ static WSADATA wsa; # define fcntl(a, b, c) 0 # define EWOULDBLOCK 0 +# define EAGAIN 0 # define EINPROGRESS 0 # define typecorrect_getsockopt(socket, level, optname, optval, optlen) \ getsockopt(socket, level, optname, (char *)optval, optlen) @@ -99,6 +100,7 @@ EOF (define-foreign-variable _ipproto_tcp int "IPPROTO_TCP") (define-foreign-variable _invalid_socket int "INVALID_SOCKET") (define-foreign-variable _ewouldblock int "EWOULDBLOCK") +(define-foreign-variable _eagain int "EAGAIN") (define-foreign-variable _eintr int "EINTR") (define-foreign-variable _einprogress int "EINPROGRESS") @@ -348,7 +350,8 @@ EOF (let loop () (let ((n (##net#recv fd buf +input-buffer-size+ 0))) (cond ((eq? -1 n) - (cond ((eq? errno _ewouldblock) + (cond ((or (eq? errno _ewouldblock) + (eq? errno _eagain)) (when tmr (##sys#thread-block-for-timeout! ##sys#current-thread @@ -465,7 +468,8 @@ EOF (let* ((count (fxmin +output-chunk-size+ len)) (n (##net#send fd s offset count 0)) ) (cond ((eq? -1 n) - (cond ((eq? errno _ewouldblock) + (cond ((or (eq? errno _ewouldblock) + (eq? errno _eagain)) (when tmw (##sys#thread-block-for-timeout! ##sys#current-thread -- 1.6.0.4
_______________________________________________ Chicken-hackers mailing list Chicken-hackers@nongnu.org https://lists.nongnu.org/mailman/listinfo/chicken-hackers