ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/EV/EV.xs
Revision: 1.1
Committed: Mon Oct 29 19:13:39 2007 UTC (16 years, 7 months ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# Content
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #include <assert.h>
6 #include <string.h>
7
8 #include "EVAPI.h"
9 #include "../Coro/CoroAPI.h"
10
11 static void
12 once_cb (int fd, short revents, void *arg)
13 {
14 AV *av = (AV *)arg; /* @_ */
15 av_push (av, newSViv (revents));
16 CORO_READY (AvARRAY (av)[0]);
17 SvREFCNT_dec (av);
18 }
19
20 #define ONCE_INIT AV *av = GvAV (PL_defgv);
21 #define ONCE_CBARG once_cb, SvREFCNT_inc (av)
22 #define ONCE_DONE av_clear (av); av_push (av, SvREFCNT_inc (CORO_CURRENT));
23
24 MODULE = Coro::EV PACKAGE = Coro::EV
25
26 PROTOTYPES: ENABLE
27
28 BOOT:
29 {
30 I_EV_API ("Coro::EV");
31 I_CORO_API ("Coro::Event");
32 }
33
34 void
35 _timed_io_once (...)
36 CODE:
37 {
38 ONCE_INIT;
39 assert (AvFILLp (av) >= 1);
40 GEVAPI->once (
41 SvIV (AvARRAY (av)[0]),
42 SvIV (AvARRAY (av)[1]),
43 AvFILLp (av) >= 2 ? SvNV (AvARRAY (av)[2]) : 0.,
44 ONCE_CBARG
45 );
46 ONCE_DONE;
47 }
48
49 void
50 _timer_once (...)
51 CODE:
52 {
53 ONCE_INIT;
54 NV after = SvNV (AvARRAY (av)[0]);
55 GEVAPI->once (
56 -1,
57 EV_TIMEOUT,
58 after > 0. ? after : 1e-30,
59 ONCE_CBARG
60 );
61 ONCE_DONE;
62 }
63
64 void
65 loop ()
66 CODE:
67 while (1)
68 {
69 while (CORO_NREADY)
70 CORO_CEDE_NOTSELF;
71
72 GEVAPI->loop (EVLOOP_ONCE);
73 }
74
75