ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Event/Event.xs
(Generate patch)

Comparing Coro/Event/Event.xs (file contents):
Revision 1.9 by root, Sat Mar 22 18:50:32 2003 UTC vs.
Revision 1.10 by root, Thu Nov 23 23:54:02 2006 UTC

31#define CD_GOT 5 /* hardcoded in Coro::Event, Coro::Handle */ 31#define CD_GOT 5 /* hardcoded in Coro::Event, Coro::Handle */
32#define CD_MAX 5 32#define CD_MAX 5
33 33
34#define EV_CLASS "Coro::Event" 34#define EV_CLASS "Coro::Event"
35 35
36static pe_idle *scheduler;
37static int do_schedule;
38
39#define NEED_SCHEDULE if (!do_schedule) \
40 { \
41 do_schedule = 1; \
42 GEventAPI->now ((pe_watcher *)scheduler); \
43 }
44
45static void 36static void
46coro_std_cb(pe_event *pe) 37coro_std_cb(pe_event *pe)
47{ 38{
48 AV *priv = (AV *)pe->ext_data; 39 AV *priv = (AV *)pe->ext_data;
49 IV type = SvIV (*av_fetch (priv, CD_TYPE, 1)); 40 IV type = SvIV (*av_fetch (priv, CD_TYPE, 1));
58 if (*cd_coro != &PL_sv_undef) 49 if (*cd_coro != &PL_sv_undef)
59 { 50 {
60 CORO_READY (*cd_coro); 51 CORO_READY (*cd_coro);
61 SvREFCNT_dec (*cd_coro); 52 SvREFCNT_dec (*cd_coro);
62 *cd_coro = &PL_sv_undef; 53 *cd_coro = &PL_sv_undef;
63 NEED_SCHEDULE;
64 } 54 }
65 else 55 else
66 { 56 {
67 AvARRAY(priv)[CD_OK] = &PL_sv_yes; 57 AvARRAY(priv)[CD_OK] = &PL_sv_yes;
68 GEventAPI->stop (pe->up, 0); 58 GEventAPI->stop (pe->up, 0);
69 } 59 }
70} 60}
71 61
72static void 62static double
73scheduler_cb(pe_event *pe) 63prepare_hook (void *data)
74{ 64{
75 while (CORO_NREADY) 65 while (CORO_NREADY)
76 CORO_CEDE; 66 CORO_CEDE;
77 67
78 do_schedule = 0; 68 return 1e20;
79} 69}
80 70
81MODULE = Coro::Event PACKAGE = Coro::Event 71MODULE = Coro::Event PACKAGE = Coro::Event
82 72
83PROTOTYPES: ENABLE 73PROTOTYPES: ENABLE
85BOOT: 75BOOT:
86{ 76{
87 I_EVENT_API ("Coro::Event"); 77 I_EVENT_API ("Coro::Event");
88 I_CORO_API ("Coro::Event"); 78 I_CORO_API ("Coro::Event");
89 79
90 /* create a fake idle handler (we only ever call now) */ 80 GEventAPI->add_hook ("prepare", (void *)prepare_hook, 0);
91 scheduler = GEventAPI->new_idle (0, 0);
92 scheduler->base.callback = scheduler_cb;
93 scheduler->base.prio = PE_PRIO_NORMAL; /* StarvePrio */
94 scheduler->min_interval = newSVnv (0);
95 scheduler->max_interval = newSVnv (0);
96 GEventAPI->stop ((pe_watcher *)scheduler, 0);
97} 81}
98 82
99void 83void
100_install_std_cb(self,type) 84_install_std_cb(self,type)
101 SV * self 85 SV * self
150 134
151 AvARRAY(priv)[CD_CORO] = SvREFCNT_inc (CORO_CURRENT); 135 AvARRAY(priv)[CD_CORO] = SvREFCNT_inc (CORO_CURRENT);
152 XSRETURN_YES; 136 XSRETURN_YES;
153 } 137 }
154 138
155MODULE = Coro::Event PACKAGE = Coro
156
157# overwrite the ready function
158void
159ready(self)
160 SV * self
161 PROTOTYPE: $
162 CODE:
163 NEED_SCHEDULE;
164 CORO_READY (self);
165
166

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines