1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien.c-types kernel io.ports io.unix.backend
4 bit-arrays sequences assocs unix unix.linux.epoll math
8 TUPLE: epoll-mx < mx events ;
11 #! We read up to 256 events at a time. This is an arbitrary
15 : <epoll-mx> ( -- mx )
17 max-events epoll_create dup io-error over set-mx-fd
18 max-events "epoll-event" <c-array> over set-epoll-mx-events ;
20 GENERIC: io-task-events ( task -- n )
22 M: input-task io-task-events drop EPOLLIN ;
24 M: output-task io-task-events drop EPOLLOUT ;
26 : make-event ( task -- event )
27 "epoll-event" <c-object>
28 over io-task-events over set-epoll-event-events
29 swap io-task-fd over set-epoll-event-fd ;
31 : do-epoll-ctl ( task mx what -- )
32 >r mx-fd r> rot dup io-task-fd swap make-event
35 M: epoll-mx register-io-task ( task mx -- )
36 [ EPOLL_CTL_ADD do-epoll-ctl ] [ call-next-method ] 2bi ;
38 M: epoll-mx unregister-io-task ( task mx -- )
39 [ call-next-method ] [ EPOLL_CTL_DEL do-epoll-ctl ] 2bi ;
41 : wait-event ( mx timeout -- n )
42 >r { mx-fd epoll-mx-events } get-slots max-events
43 r> epoll_wait dup multiplexer-error ;
45 : epoll-read-task ( mx fd -- )
46 over mx-reads at* [ perform-io-task ] [ 2drop ] if ;
48 : epoll-write-task ( mx fd -- )
49 over mx-writes at* [ perform-io-task ] [ 2drop ] if ;
51 : handle-event ( mx kevent -- )
52 epoll-event-fd 2dup epoll-read-task epoll-write-task ;
54 : handle-events ( mx n -- )
56 over epoll-mx-events epoll-event-nth handle-event
59 M: epoll-mx wait-for-events ( ms mx -- )
60 dup rot wait-event handle-events ;