… | |
… | |
36 | static void |
36 | static void |
37 | coro_std_cb(pe_event *pe) |
37 | coro_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 | |
62 | static double |
63 | static double |
63 | prepare_hook (void *data) |
64 | prepare_hook (void *data) |
… | |
… | |
83 | void |
84 | void |
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 | |
115 | void |
118 | void |
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 | |