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 {