… | |
… | |
3621 | void |
3621 | void |
3622 | list () |
3622 | list () |
3623 | PROTOTYPE: |
3623 | PROTOTYPE: |
3624 | PPCODE: |
3624 | PPCODE: |
3625 | { |
3625 | { |
3626 | struct coro *coro; |
3626 | struct coro *coro; |
3627 | for (coro = coro_first; coro; coro = coro->next) |
3627 | for (coro = coro_first; coro; coro = coro->next) |
3628 | if (coro->hv) |
3628 | if (coro->hv) |
3629 | XPUSHs (sv_2mortal (newRV_inc ((SV *)coro->hv))); |
3629 | XPUSHs (sv_2mortal (newRV_inc ((SV *)coro->hv))); |
3630 | } |
3630 | } |
3631 | |
3631 | |
… | |
… | |
3793 | |
3793 | |
3794 | void |
3794 | void |
3795 | times (Coro::State self) |
3795 | times (Coro::State self) |
3796 | PPCODE: |
3796 | PPCODE: |
3797 | { |
3797 | { |
3798 | struct coro *current = SvSTATE (coro_current); |
3798 | struct coro *current = SvSTATE (coro_current); |
3799 | |
3799 | |
3800 | if (ecb_expect_false (current == self)) |
3800 | if (ecb_expect_false (current == self)) |
3801 | { |
3801 | { |
3802 | coro_times_update (); |
3802 | coro_times_update (); |
3803 | coro_times_add (SvSTATE (coro_current)); |
3803 | coro_times_add (SvSTATE (coro_current)); |
… | |
… | |
4078 | on_leave = 1 |
4078 | on_leave = 1 |
4079 | PROTOTYPE: & |
4079 | PROTOTYPE: & |
4080 | CODE: |
4080 | CODE: |
4081 | { |
4081 | { |
4082 | struct coro *coro = SvSTATE_current; |
4082 | struct coro *coro = SvSTATE_current; |
4083 | AV **avp = ix ? &coro->on_leave : &coro->on_enter; |
4083 | AV **avp = ix ? &coro->on_leave : &coro->on_enter; |
4084 | |
4084 | |
4085 | block = s_get_cv_croak (block); |
4085 | block = s_get_cv_croak (block); |
4086 | |
4086 | |
4087 | if (!*avp) |
4087 | if (!*avp) |
4088 | *avp = newAV (); |
4088 | *avp = newAV (); |
… | |
… | |
4108 | |
4108 | |
4109 | SV * |
4109 | SV * |
4110 | new (SV *klass, SV *count = 0) |
4110 | new (SV *klass, SV *count = 0) |
4111 | CODE: |
4111 | CODE: |
4112 | { |
4112 | { |
4113 | int semcnt = 1; |
4113 | int semcnt = 1; |
4114 | |
4114 | |
4115 | if (count) |
4115 | if (count) |
4116 | { |
4116 | { |
4117 | SvGETMAGIC (count); |
4117 | SvGETMAGIC (count); |
4118 | |
4118 | |
… | |
… | |
4178 | XSRETURN_NO; |
4178 | XSRETURN_NO; |
4179 | } |
4179 | } |
4180 | |
4180 | |
4181 | void |
4181 | void |
4182 | waiters (SV *self) |
4182 | waiters (SV *self) |
4183 | PPCODE: |
4183 | PPCODE: |
4184 | { |
4184 | { |
4185 | AV *av = (AV *)SvRV (self); |
4185 | AV *av = (AV *)SvRV (self); |
4186 | int wcount = AvFILLp (av) + 1 - 1; |
4186 | int wcount = AvFILLp (av) + 1 - 1; |
4187 | |
4187 | |
4188 | if (GIMME_V == G_SCALAR) |
4188 | if (GIMME_V == G_SCALAR) |
… | |
… | |
4200 | |
4200 | |
4201 | void |
4201 | void |
4202 | _may_delete (SV *sem, int count, unsigned int extra_refs) |
4202 | _may_delete (SV *sem, int count, unsigned int extra_refs) |
4203 | PPCODE: |
4203 | PPCODE: |
4204 | { |
4204 | { |
4205 | AV *av = (AV *)SvRV (sem); |
4205 | AV *av = (AV *)SvRV (sem); |
4206 | |
4206 | |
4207 | if (SvREFCNT ((SV *)av) == 1 + extra_refs |
4207 | if (SvREFCNT ((SV *)av) == 1 + extra_refs |
4208 | && AvFILLp (av) == 0 /* no waiters, just count */ |
4208 | && AvFILLp (av) == 0 /* no waiters, just count */ |
4209 | && SvIV (AvARRAY (av)[0]) == count) |
4209 | && SvIV (AvARRAY (av)[0]) == count) |
4210 | XSRETURN_YES; |
4210 | XSRETURN_YES; |
… | |
… | |
4231 | |
4231 | |
4232 | void |
4232 | void |
4233 | broadcast (SV *self) |
4233 | broadcast (SV *self) |
4234 | CODE: |
4234 | CODE: |
4235 | { |
4235 | { |
4236 | AV *av = (AV *)SvRV (self); |
4236 | AV *av = (AV *)SvRV (self); |
4237 | coro_signal_wake (aTHX_ av, AvFILLp (av)); |
4237 | coro_signal_wake (aTHX_ av, AvFILLp (av)); |
4238 | } |
4238 | } |
4239 | |
4239 | |
4240 | void |
4240 | void |
4241 | send (SV *self) |
4241 | send (SV *self) |
… | |
… | |
4249 | SvIVX (AvARRAY (av)[0]) = 1; /* remember the signal */ |
4249 | SvIVX (AvARRAY (av)[0]) = 1; /* remember the signal */ |
4250 | } |
4250 | } |
4251 | |
4251 | |
4252 | IV |
4252 | IV |
4253 | awaited (SV *self) |
4253 | awaited (SV *self) |
4254 | CODE: |
4254 | CODE: |
4255 | RETVAL = AvFILLp ((AV *)SvRV (self)) + 1 - 1; |
4255 | RETVAL = AvFILLp ((AV *)SvRV (self)) + 1 - 1; |
4256 | OUTPUT: |
4256 | OUTPUT: |
4257 | RETVAL |
4257 | RETVAL |
4258 | |
4258 | |
4259 | |
4259 | |
… | |
… | |
4264 | |
4264 | |
4265 | void |
4265 | void |
4266 | _schedule (...) |
4266 | _schedule (...) |
4267 | CODE: |
4267 | CODE: |
4268 | { |
4268 | { |
4269 | static int incede; |
4269 | static int incede; |
4270 | |
4270 | |
4271 | api_cede_notself (aTHX); |
4271 | api_cede_notself (aTHX); |
4272 | |
4272 | |
4273 | ++incede; |
4273 | ++incede; |
4274 | while (coro_nready >= incede && api_cede (aTHX)) |
4274 | while (coro_nready >= incede && api_cede (aTHX)) |