1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors classes.struct kernel destructors bit-arrays
4 sequences assocs specialized-arrays math namespaces
5 locals fry unix unix.linux.epoll unix.time io.ports
6 io.backend.unix io.backend.unix.multiplexers ;
7 SPECIALIZED-ARRAY: epoll-event
8 IN: io.backend.unix.multiplexers.epoll
10 TUPLE: epoll-mx < mx events ;
13 #! We read up to 256 events at a time. This is an arbitrary
17 : <epoll-mx> ( -- mx )
19 max-events epoll_create dup io-error >>fd
20 max-events <epoll-event-array> >>events ;
22 M: epoll-mx dispose* fd>> close-file ;
24 : make-event ( fd events -- event )
29 :: do-epoll-ctl ( fd mx what events -- )
30 mx fd>> what fd fd events make-event epoll_ctl io-error ;
32 : do-epoll-add ( fd mx events -- )
33 EPOLL_CTL_ADD swap EPOLLONESHOT bitor do-epoll-ctl ;
35 : do-epoll-del ( fd mx events -- )
36 EPOLL_CTL_DEL swap do-epoll-ctl ;
38 M: epoll-mx add-input-callback ( thread fd mx -- )
39 [ EPOLLIN do-epoll-add ] [ call-next-method ] 2bi ;
41 M: epoll-mx add-output-callback ( thread fd mx -- )
42 [ EPOLLOUT do-epoll-add ] [ call-next-method ] 2bi ;
44 M: epoll-mx remove-input-callbacks ( fd mx -- seq )
46 [ call-next-method ] [ EPOLLIN do-epoll-del ] 2bi
49 M: epoll-mx remove-output-callbacks ( fd mx -- seq )
51 [ EPOLLOUT do-epoll-del ] [ call-next-method ] 2bi
54 : wait-event ( mx us -- n )
55 [ [ fd>> ] [ events>> ] bi dup length ] [ 1000 /i ] bi*
56 epoll_wait multiplexer-error ;
58 : handle-event ( event mx -- )
60 [ EPOLLIN EPOLLOUT bitor do-epoll-del ]
61 [ input-available ] [ output-available ] 2tri ;
63 : handle-events ( mx n -- )
64 [ dup events>> ] dip head-slice swap '[ _ handle-event ] each ;
66 M: epoll-mx wait-for-events ( us mx -- )
67 swap 60000000 or dupd wait-event handle-events ;