kqueue and epoll code wasn't checking for EINTR properly, leading to hangs
parent
f020fd39ec
commit
d327786cb9
|
@ -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 )
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue