Fix some bugs in epoll, and use it on Linux
parent
d70d4c1352
commit
e42de00371
|
@ -1,8 +1,8 @@
|
||||||
! Copyright (C) 2008 Slava Pestov.
|
! Copyright (C) 2008 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors alien.c-types kernel io.ports io.unix.backend
|
USING: accessors alien.c-types kernel io.ports io.unix.backend
|
||||||
bit-arrays sequences assocs struct-arrays unix unix.linux.epoll
|
bit-arrays sequences assocs struct-arrays math namespaces locals
|
||||||
math namespaces locals unix.time ;
|
fry unix unix.linux.epoll unix.time ;
|
||||||
IN: io.unix.epoll
|
IN: io.unix.epoll
|
||||||
|
|
||||||
TUPLE: epoll-mx < mx events ;
|
TUPLE: epoll-mx < mx events ;
|
||||||
|
@ -23,7 +23,7 @@ TUPLE: epoll-mx < mx events ;
|
||||||
[ set-epoll-event-fd ] keep ;
|
[ set-epoll-event-fd ] keep ;
|
||||||
|
|
||||||
:: do-epoll-ctl ( fd mx what events -- )
|
:: do-epoll-ctl ( fd mx what events -- )
|
||||||
mx fd>> what fd events make-event what epoll_ctl io-error ;
|
mx fd>> what fd fd events make-event epoll_ctl io-error ;
|
||||||
|
|
||||||
: do-epoll-add ( fd mx events -- )
|
: do-epoll-add ( fd mx events -- )
|
||||||
EPOLL_CTL_ADD swap EPOLLONESHOT bitor do-epoll-ctl ;
|
EPOLL_CTL_ADD swap EPOLLONESHOT bitor do-epoll-ctl ;
|
||||||
|
@ -48,14 +48,16 @@ M: epoll-mx remove-output-callbacks ( fd mx -- seq )
|
||||||
] [ 2drop f ] if ;
|
] [ 2drop f ] if ;
|
||||||
|
|
||||||
: wait-event ( mx us -- n )
|
: wait-event ( mx us -- n )
|
||||||
[ [ fd>> ] [ events>> ] bi max-events ] [ 1000 /i ] bi*
|
[ [ fd>> ] [ events>> ] bi [ underlying>> ] [ length ] bi ] [ 1000 /i ] bi*
|
||||||
epoll_wait dup multiplexer-error ;
|
epoll_wait dup multiplexer-error ;
|
||||||
|
|
||||||
: handle-event ( mx event -- )
|
: handle-event ( event mx -- )
|
||||||
epoll-event-fd [ input-available ] [ output-available ] 2bi ;
|
[ epoll-event-fd ] dip
|
||||||
|
[ EPOLLIN EPOLLOUT bitor do-epoll-del ]
|
||||||
|
[ input-available ] [ output-available ] 2tri ;
|
||||||
|
|
||||||
: handle-events ( mx n -- )
|
: handle-events ( mx n -- )
|
||||||
[ dup events>> ] dip head-slice [ handle-event ] with each ;
|
[ dup events>> ] dip head-slice swap '[ _ handle-event ] each ;
|
||||||
|
|
||||||
M: epoll-mx wait-for-events ( us mx -- )
|
M: epoll-mx wait-for-events ( us mx -- )
|
||||||
swap 60000 or dupd wait-event handle-events ;
|
swap 60000000 or dupd wait-event handle-events ;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
! Copyright (C) 2008 Slava Pestov.
|
! Copyright (C) 2008 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel io.backend io.monitors io.unix.backend
|
USING: kernel io.backend io.monitors io.unix.backend
|
||||||
io.unix.select io.unix.linux.monitors system namespaces ;
|
io.unix.epoll io.unix.linux.monitors system namespaces ;
|
||||||
IN: io.unix.linux
|
IN: io.unix.linux
|
||||||
|
|
||||||
M: linux init-io ( -- )
|
M: linux init-io ( -- )
|
||||||
<select-mx> mx set-global ;
|
<epoll-mx> mx set-global ;
|
||||||
|
|
||||||
linux set-io-backend
|
linux set-io-backend
|
||||||
|
|
Loading…
Reference in New Issue