From d327786cb9a3f5a287f7916d98dbe8c9d58d1af5 Mon Sep 17 00:00:00 2001 From: Slava Pestov <slava@slava-pestovs-macbook-pro.local> Date: Wed, 10 Dec 2008 20:10:47 -0600 Subject: [PATCH] kqueue and epoll code wasn't checking for EINTR properly, leading to hangs --- basis/io/unix/backend/backend.factor | 6 +++--- basis/io/unix/epoll/epoll.factor | 2 +- basis/io/unix/kqueue/kqueue.factor | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/basis/io/unix/backend/backend.factor b/basis/io/unix/backend/backend.factor index 1666d60c83..7f4e03ef09 100644 --- a/basis/io/unix/backend/backend.factor +++ b/basis/io/unix/backend/backend.factor @@ -207,10 +207,10 @@ TUPLE: mx-port < port mx ; : <mx-port> ( mx -- port ) dup fd>> mx-port <port> swap >>mx ; -: multiplexer-error ( n -- ) - 0 < [ +: multiplexer-error ( n -- n ) + dup 0 < [ err_no [ EAGAIN = ] [ EINTR = ] bi or - [ (io-error) ] unless + [ drop 0 ] [ (io-error) ] if ] when ; : ?flag ( n mask symbol -- n ) diff --git a/basis/io/unix/epoll/epoll.factor b/basis/io/unix/epoll/epoll.factor index e8d33787f3..93d0b4aa99 100644 --- a/basis/io/unix/epoll/epoll.factor +++ b/basis/io/unix/epoll/epoll.factor @@ -49,7 +49,7 @@ M: epoll-mx remove-output-callbacks ( fd mx -- seq ) : wait-event ( mx us -- n ) [ [ fd>> ] [ events>> ] bi [ underlying>> ] [ length ] bi ] [ 1000 /i ] bi* - epoll_wait dup multiplexer-error ; + epoll_wait multiplexer-error ; : handle-event ( event mx -- ) [ epoll-event-fd ] dip diff --git a/basis/io/unix/kqueue/kqueue.factor b/basis/io/unix/kqueue/kqueue.factor index b4e2b7af6f..be99d17572 100644 --- a/basis/io/unix/kqueue/kqueue.factor +++ b/basis/io/unix/kqueue/kqueue.factor @@ -58,8 +58,7 @@ M: kqueue-mx remove-output-callbacks ( fd mx -- seq ) [ [ fd>> f 0 ] [ events>> [ underlying>> ] [ length ] bi ] bi - ] dip kevent - dup multiplexer-error ; + ] dip kevent multiplexer-error ; : handle-kevent ( mx kevent -- ) [ kevent-ident swap ] [ kevent-filter ] bi {