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, 9 months ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.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