factor/basis/io/unix/epoll/epoll.factor

62 lines
1.9 KiB
Factor
Raw Normal View History

! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2008-12-09 21:01:23 -05:00
USING: accessors alien.c-types kernel io.ports io.unix.backend
bit-arrays sequences assocs struct-arrays unix unix.linux.epoll
math namespaces locals unix.time ;
IN: io.unix.epoll
2008-04-11 13:47:49 -04:00
TUPLE: epoll-mx < mx events ;
: max-events ( -- n )
#! We read up to 256 events at a time. This is an arbitrary
#! constant...
256 ; inline
: <epoll-mx> ( -- mx )
epoll-mx new-mx
2008-12-09 21:01:23 -05:00
max-events epoll_create dup io-error >>fd
max-events "epoll-event" <struct-array> >>events ;
2008-12-09 21:01:23 -05:00
: make-event ( fd events -- event )
"epoll-event" <c-object>
[ set-epoll-event-events ] keep
[ set-epoll-event-fd ] keep ;
2008-01-21 15:33:43 -05:00
2008-12-09 21:01:23 -05:00
:: do-epoll-ctl ( fd mx what events -- )
mx fd>> what fd events make-event what epoll_ctl io-error ;
2008-12-09 21:01:23 -05:00
: do-epoll-add ( fd mx events -- )
EPOLL_CTL_ADD swap EPOLLONESHOT bitor do-epoll-ctl ;
2008-12-09 21:01:23 -05:00
: do-epoll-del ( fd mx events -- )
EPOLL_CTL_DEL swap do-epoll-ctl ;
2008-12-09 21:01:23 -05:00
M: epoll-mx add-input-callback ( thread fd mx -- )
[ EPOLLIN do-epoll-add ] [ call-next-method ] 2bi ;
2008-12-09 21:01:23 -05:00
M: epoll-mx add-output-callback ( thread fd mx -- )
[ EPOLLOUT do-epoll-add ] [ call-next-method ] 2bi ;
2008-12-09 21:01:23 -05:00
M: epoll-mx remove-input-callbacks ( fd mx -- seq )
2dup reads>> key? [
[ call-next-method ] [ EPOLLIN do-epoll-del ] 2bi
] [ 2drop f ] if ;
2008-12-09 21:01:23 -05:00
M: epoll-mx remove-output-callbacks ( fd mx -- seq )
2dup writes>> key? [
[ EPOLLOUT do-epoll-del ] [ call-next-method ] 2bi
] [ 2drop f ] if ;
2008-12-09 21:01:23 -05:00
: wait-event ( mx us -- n )
[ [ fd>> ] [ events>> ] bi max-events ] [ 1000 /i ] bi*
epoll_wait dup multiplexer-error ;
2008-12-09 21:01:23 -05:00
: handle-event ( mx event -- )
epoll-event-fd [ input-available ] [ output-available ] 2bi ;
: handle-events ( mx n -- )
2008-12-09 21:01:23 -05:00
[ dup events>> ] dip head-slice [ handle-event ] with each ;
2008-12-09 21:01:23 -05:00
M: epoll-mx wait-for-events ( us mx -- )
swap 60000 or dupd wait-event handle-events ;