]> gitweb.factorcode.org Git - factor.git/blob - basis/io/backend/unix/multiplexers/run-loop/run-loop.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / basis / io / backend / unix / multiplexers / run-loop / run-loop.factor
1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel arrays namespaces math accessors alien locals
4 destructors system threads io.backend.unix.multiplexers
5 io.backend.unix.multiplexers.kqueue core-foundation
6 core-foundation.run-loop core-foundation.file-descriptors ;
7 FROM: alien.c-types => void void* ;
8 IN: io.backend.unix.multiplexers.run-loop
9
10 TUPLE: run-loop-mx kqueue-mx ;
11
12 : file-descriptor-callback ( -- callback )
13     void { CFFileDescriptorRef CFOptionFlags void* }
14     "cdecl" [
15         3drop
16         0 mx get kqueue-mx>> wait-for-events
17         reset-run-loop
18         yield
19     ] alien-callback ;
20
21 : <run-loop-mx> ( -- mx )
22     [
23         <kqueue-mx> |dispose
24         dup fd>> file-descriptor-callback add-fd-to-run-loop
25         run-loop-mx boa
26     ] with-destructors ;
27
28 M: run-loop-mx add-input-callback kqueue-mx>> add-input-callback ;
29 M: run-loop-mx add-output-callback kqueue-mx>> add-output-callback ;
30 M: run-loop-mx remove-input-callbacks kqueue-mx>> remove-input-callbacks ;
31 M: run-loop-mx remove-output-callbacks kqueue-mx>> remove-output-callbacks ;
32
33 M: run-loop-mx wait-for-events ( us mx -- )
34     swap run-one-iteration [ 0 swap wait-for-events ] [ drop ] if ;