]> gitweb.factorcode.org Git - factor.git/blob - basis/io/backend/unix/multiplexers/epoll/epoll.factor
basis: removing unnecessary method stack effects.
[factor.git] / basis / io / backend / unix / multiplexers / epoll / epoll.factor
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 libc 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
9
10 TUPLE: epoll-mx < mx events ;
11
12 ! We read up to 256 events at a time. This is an arbitrary
13 ! constant...
14 CONSTANT: max-events 256
15
16 : <epoll-mx> ( -- mx )
17     epoll-mx new-mx
18         max-events epoll_create dup io-error >>fd
19         max-events <epoll-event-array> >>events ;
20
21 M: epoll-mx dispose* fd>> close-file ;
22
23 : make-event ( fd events -- event )
24     epoll-event <struct>
25         swap >>events
26         tuck data>> fd<< ;
27
28 :: do-epoll-ctl ( fd mx what events -- )
29     mx fd>> what fd fd events make-event epoll_ctl io-error ;
30
31 : do-epoll-add ( fd mx events -- )
32     EPOLL_CTL_ADD swap EPOLLONESHOT bitor do-epoll-ctl ;
33
34 : do-epoll-del ( fd mx events -- )
35     EPOLL_CTL_DEL swap do-epoll-ctl ;
36
37 M: epoll-mx add-input-callback
38     [ EPOLLIN do-epoll-add ] [ call-next-method ] 2bi ;
39
40 M: epoll-mx add-output-callback
41     [ EPOLLOUT do-epoll-add ] [ call-next-method ] 2bi ;
42
43 M: epoll-mx remove-input-callbacks
44     2dup reads>> key? [
45         [ call-next-method ] [ EPOLLIN do-epoll-del ] 2bi
46     ] [ 2drop f ] if ;
47
48 M: epoll-mx remove-output-callbacks
49     2dup writes>> key? [
50         [ EPOLLOUT do-epoll-del ] [ call-next-method ] 2bi
51     ] [ 2drop f ] if ;
52
53 : wait-event ( mx nanos -- n )
54     [ [ fd>> ] [ events>> ] bi dup length ] [ 1000000 /i ] bi*
55     epoll_wait multiplexer-error ;
56
57 : handle-event ( event mx -- )
58     [ data>> fd>> ] dip
59     [ EPOLLIN EPOLLOUT bitor do-epoll-del ]
60     [ input-available ] [ output-available ] 2tri ;
61
62 : handle-events ( mx n -- )
63     [ dup events>> ] dip head-slice swap '[ _ handle-event ] each ;
64
65 M: epoll-mx wait-for-events
66     swap 60000000 or dupd wait-event handle-events ;