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.10 by root, Thu Nov 23 23:54:02 2006 UTC vs.
Revision 1.12 by root, Fri Dec 1 02:17:37 2006 UTC

36static void 36static void
37coro_std_cb(pe_event *pe) 37coro_std_cb(pe_event *pe)
38{ 38{
39 AV *priv = (AV *)pe->ext_data; 39 AV *priv = (AV *)pe->ext_data;
40 IV type = SvIV (*av_fetch (priv, CD_TYPE, 1)); 40 IV type = SvIV (*av_fetch (priv, CD_TYPE, 1));
41 SV **cd_coro = &AvARRAY(priv)[CD_CORO]; 41 SV **cd_coro;
42 42
43 sv_setiv (AvARRAY(priv)[CD_PRIO], pe->prio); 43 sv_setiv (AvARRAY(priv)[CD_PRIO], pe->prio);
44 sv_setiv (AvARRAY(priv)[CD_HITS], pe->hits); 44 sv_setiv (AvARRAY(priv)[CD_HITS], pe->hits);
45 45
46 if (type == 1) 46 if (type == 1)
47 sv_setiv (AvARRAY(priv)[CD_GOT], ((pe_ioevent *)pe)->got); 47 sv_setiv (AvARRAY(priv)[CD_GOT], ((pe_ioevent *)pe)->got);
48 48
49 GEventAPI->stop (pe->up, 0);
50
51 AvARRAY(priv)[CD_OK] = &PL_sv_yes;
52
53 cd_coro = &AvARRAY(priv)[CD_CORO];
49 if (*cd_coro != &PL_sv_undef) 54 if (*cd_coro != &PL_sv_undef)
50 { 55 {
56 AvARRAY(priv)[CD_OK] = &PL_sv_yes;
51 CORO_READY (*cd_coro); 57 CORO_READY (*cd_coro);
52 SvREFCNT_dec (*cd_coro); 58 SvREFCNT_dec (*cd_coro);
53 *cd_coro = &PL_sv_undef; 59 *cd_coro = &PL_sv_undef;
54 }
55 else
56 {
57 AvARRAY(priv)[CD_OK] = &PL_sv_yes;
58 GEventAPI->stop (pe->up, 0);
59 } 60 }
60} 61}
61 62
62static double 63static double
63prepare_hook (void *data) 64prepare_hook (void *data)
64{ 65{
65 while (CORO_NREADY) 66 while (CORO_NREADY)
66 CORO_CEDE; 67 CORO_CEDE;
67 68
68 return 1e20; 69 return 1e10;
69} 70}
70 71
71MODULE = Coro::Event PACKAGE = Coro::Event 72MODULE = Coro::Event PACKAGE = Coro::Event
72 73
73PROTOTYPES: ENABLE 74PROTOTYPES: ENABLE
83void 84void
84_install_std_cb(self,type) 85_install_std_cb(self,type)
85 SV * self 86 SV * self
86 int type 87 int type
87 CODE: 88 CODE:
89{
88 pe_watcher *w = GEventAPI->sv_2watcher (self); 90 pe_watcher *w = GEventAPI->sv_2watcher (self);
89 91
90 if (WaFLAGS (w) & PE_PERLCB) 92 if (WaFLAGS (w) & PE_PERLCB)
91 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");
92 { 94 {
109 EV_CLASS, strlen (EV_CLASS), 111 EV_CLASS, strlen (EV_CLASS),
110 rv, 0); 112 rv, 0);
111 113
112 GEventAPI->start (w, 0); 114 GEventAPI->start (w, 0);
113 } 115 }
116}
114 117
115void 118void
116_next(self) 119_next(self)
117 SV * self 120 SV * self
118 CODE: 121 CODE:
122{
119 pe_watcher *w = GEventAPI->sv_2watcher (self); 123 pe_watcher *w = GEventAPI->sv_2watcher (self);
120 AV *priv = (AV *)w->ext_data; 124 AV *priv = (AV *)w->ext_data;
121
122 if (!w->running)
123 GEventAPI->start (w, 1);
124 125
125 if (AvARRAY(priv)[CD_OK] == &PL_sv_yes) 126 if (AvARRAY(priv)[CD_OK] == &PL_sv_yes)
126 { 127 {
127 AvARRAY(priv)[CD_OK] = &PL_sv_no; 128 AvARRAY(priv)[CD_OK] = &PL_sv_no;
128 XSRETURN_NO; 129 XSRETURN_NO;
129 } 130 }
130 else
131 {
132 if (AvARRAY(priv)[CD_CORO] != &PL_sv_undef)
133 confess ("only one coroutine can wait for an event");
134 131
135 AvARRAY(priv)[CD_CORO] = SvREFCNT_inc (CORO_CURRENT); 132 if (!w->running)
136 XSRETURN_YES; 133 GEventAPI->start (w, 1);
137 }
138 134
135 if (AvARRAY(priv)[CD_CORO] == &PL_sv_undef)
136 AvARRAY(priv)[CD_CORO] = SvREFCNT_inc (CORO_CURRENT);
137
138 XSRETURN_YES;
139}
140

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines