]> gitweb.factorcode.org Git - factor.git/blob - basis/io/unix/epoll/epoll.factor
Create basis vocab root
[factor.git] / basis / io / unix / epoll / epoll.factor
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
5 namespaces structs ;
6 IN: io.unix.epoll
7
8 TUPLE: epoll-mx < mx events ;
9
10 : max-events ( -- n )
11     #! We read up to 256 events at a time. This is an arbitrary
12     #! constant...
13     256 ; inline
14
15 : <epoll-mx> ( -- mx )
16     epoll-mx new-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 ;
19
20 GENERIC: io-task-events ( task -- n )
21
22 M: input-task io-task-events drop EPOLLIN ;
23
24 M: output-task io-task-events drop EPOLLOUT ;
25
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 ;
30
31 : do-epoll-ctl ( task mx what -- )
32     >r mx-fd r> rot dup io-task-fd swap make-event
33     epoll_ctl io-error ;
34
35 M: epoll-mx register-io-task ( task mx -- )
36     [ EPOLL_CTL_ADD do-epoll-ctl ] [ call-next-method ] 2bi ;
37
38 M: epoll-mx unregister-io-task ( task mx -- )
39     [ call-next-method ] [ EPOLL_CTL_DEL do-epoll-ctl ] 2bi ;
40
41 : wait-event ( mx timeout -- n )
42     >r { mx-fd epoll-mx-events } get-slots max-events
43     r> epoll_wait dup multiplexer-error ;
44
45 : epoll-read-task ( mx fd -- )
46     over mx-reads at* [ perform-io-task ] [ 2drop ] if ;
47
48 : epoll-write-task ( mx fd -- )
49     over mx-writes at* [ perform-io-task ] [ 2drop ] if ;
50
51 : handle-event ( mx kevent -- )
52     epoll-event-fd 2dup epoll-read-task epoll-write-task ;
53
54 : handle-events ( mx n -- )
55     [
56         over epoll-mx-events epoll-event-nth handle-event
57     ] with each ;
58
59 M: epoll-mx wait-for-events ( ms mx -- )
60     dup rot wait-event handle-events ;