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.12 by root, Fri Dec 1 02:17:37 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));
50 SV **cd_coro = &AvARRAY(priv)[CD_CORO]; 41 SV **cd_coro;
51 42
52 sv_setiv (AvARRAY(priv)[CD_PRIO], pe->prio); 43 sv_setiv (AvARRAY(priv)[CD_PRIO], pe->prio);
53 sv_setiv (AvARRAY(priv)[CD_HITS], pe->hits); 44 sv_setiv (AvARRAY(priv)[CD_HITS], pe->hits);
54 45
55 if (type == 1) 46 if (type == 1)
56 sv_setiv (AvARRAY(priv)[CD_GOT], ((pe_ioevent *)pe)->got); 47 sv_setiv (AvARRAY(priv)[CD_GOT], ((pe_ioevent *)pe)->got);
57 48
49 GEventAPI->stop (pe->up, 0);
50
51 AvARRAY(priv)[CD_OK] = &PL_sv_yes;
52
53 cd_coro = &AvARRAY(priv)[CD_CORO];
58 if (*cd_coro != &PL_sv_undef) 54 if (*cd_coro != &PL_sv_undef)
59 { 55 {
56 AvARRAY(priv)[CD_OK] = &PL_sv_yes;
60 CORO_READY (*cd_coro); 57 CORO_READY (*cd_coro);
61 SvREFCNT_dec (*cd_coro); 58 SvREFCNT_dec (*cd_coro);
62 *cd_coro = &PL_sv_undef; 59 *cd_coro = &PL_sv_undef;
63 NEED_SCHEDULE;
64 }
65 else
66 {
67 AvARRAY(priv)[CD_OK] = &PL_sv_yes;
68 GEventAPI->stop (pe->up, 0);
69 } 60 }
70} 61}
71 62
72static void 63static double
73scheduler_cb(pe_event *pe) 64prepare_hook (void *data)
74{ 65{
75 while (CORO_NREADY) 66 while (CORO_NREADY)
76 CORO_CEDE; 67 CORO_CEDE;
77 68
78 do_schedule = 0; 69 return 1e10;
79} 70}
80 71
81MODULE = Coro::Event PACKAGE = Coro::Event 72MODULE = Coro::Event PACKAGE = Coro::Event
82 73
83PROTOTYPES: ENABLE 74PROTOTYPES: ENABLE
85BOOT: 76BOOT:
86{ 77{
87 I_EVENT_API ("Coro::Event"); 78 I_EVENT_API ("Coro::Event");
88 I_CORO_API ("Coro::Event"); 79 I_CORO_API ("Coro::Event");
89 80
90 /* create a fake idle handler (we only ever call now) */ 81 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} 82}
98 83
99void 84void
100_install_std_cb(self,type) 85_install_std_cb(self,type)
101 SV * self 86 SV * self
102 int type 87 int type
103 CODE: 88 CODE:
89{
104 pe_watcher *w = GEventAPI->sv_2watcher (self); 90 pe_watcher *w = GEventAPI->sv_2watcher (self);
105 91
106 if (WaFLAGS (w) & PE_PERLCB) 92 if (WaFLAGS (w) & PE_PERLCB)
107 croak ("Coro::Event watchers must not have a perl callback (see Coro::Event), caught"); 93 croak ("Coro::Event watchers must not have a perl callback (see Coro::Event), caught");
108 { 94 {
125 EV_CLASS, strlen (EV_CLASS), 111 EV_CLASS, strlen (EV_CLASS),
126 rv, 0); 112 rv, 0);
127 113
128 GEventAPI->start (w, 0); 114 GEventAPI->start (w, 0);
129 } 115 }
116}
130 117
131void 118void
132_next(self) 119_next(self)
133 SV * self 120 SV * self
134 CODE: 121 CODE:
122{
135 pe_watcher *w = GEventAPI->sv_2watcher (self); 123 pe_watcher *w = GEventAPI->sv_2watcher (self);
136 AV *priv = (AV *)w->ext_data; 124 AV *priv = (AV *)w->ext_data;
137
138 if (!w->running)
139 GEventAPI->start (w, 1);
140 125
141 if (AvARRAY(priv)[CD_OK] == &PL_sv_yes) 126 if (AvARRAY(priv)[CD_OK] == &PL_sv_yes)
142 { 127 {
143 AvARRAY(priv)[CD_OK] = &PL_sv_no; 128 AvARRAY(priv)[CD_OK] = &PL_sv_no;
144 XSRETURN_NO; 129 XSRETURN_NO;
145 } 130 }
146 else
147 {
148 if (AvARRAY(priv)[CD_CORO] != &PL_sv_undef)
149 confess ("only one coroutine can wait for an event");
150 131
151 AvARRAY(priv)[CD_CORO] = SvREFCNT_inc (CORO_CURRENT); 132 if (!w->running)
152 XSRETURN_YES; 133 GEventAPI->start (w, 1);
153 }
154 134
155MODULE = Coro::Event PACKAGE = Coro 135 if (AvARRAY(priv)[CD_CORO] == &PL_sv_undef)
136 AvARRAY(priv)[CD_CORO] = SvREFCNT_inc (CORO_CURRENT);
156 137
157# overwrite the ready function 138 XSRETURN_YES;
158void 139}
159ready(self)
160 SV * self
161 PROTOTYPE: $
162 CODE:
163 NEED_SCHEDULE;
164 CORO_READY (self);
165 140
166

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines