… | |
… | |
142 | static SV *sv_pool_size; |
142 | static SV *sv_pool_size; |
143 | static SV *sv_async_pool_idle; /* description string */ |
143 | static SV *sv_async_pool_idle; /* description string */ |
144 | static AV *av_async_pool; /* idle pool */ |
144 | static AV *av_async_pool; /* idle pool */ |
145 | static SV *sv_Coro; /* class string */ |
145 | static SV *sv_Coro; /* class string */ |
146 | static CV *cv_pool_handler; |
146 | static CV *cv_pool_handler; |
147 | static CV *cv_coro_state_new; |
|
|
148 | |
147 | |
149 | /* Coro::AnyEvent */ |
148 | /* Coro::AnyEvent */ |
150 | static SV *sv_activity; |
149 | static SV *sv_activity; |
151 | |
150 | |
152 | /* enable processtime/realtime profiling */ |
151 | /* enable processtime/realtime profiling */ |
… | |
… | |
290 | static OP *(*coro_old_pp_sselect) (pTHX); |
289 | static OP *(*coro_old_pp_sselect) (pTHX); |
291 | static SV *coro_select_select; |
290 | static SV *coro_select_select; |
292 | |
291 | |
293 | /* horrible hack, but if it works... */ |
292 | /* horrible hack, but if it works... */ |
294 | static OP * |
293 | static OP * |
295 | coro_pp_sselect (aTHX) |
294 | coro_pp_sselect (pTHX) |
296 | { |
295 | { |
297 | dSP; |
296 | dSP; |
298 | PUSHMARK (SP - 4); /* fake argument list */ |
297 | PUSHMARK (SP - 4); /* fake argument list */ |
299 | XPUSHs (coro_select_select); |
298 | XPUSHs (coro_select_select); |
300 | PUTBACK; |
299 | PUTBACK; |
… | |
… | |
1761 | api_ready (aTHX_ SvRV (sv_idle)); |
1760 | api_ready (aTHX_ SvRV (sv_idle)); |
1762 | --coro_nready; |
1761 | --coro_nready; |
1763 | } |
1762 | } |
1764 | else |
1763 | else |
1765 | { |
1764 | { |
|
|
1765 | /* TODO: deprecated, remove, cannot work reliably *//*D*/ |
1766 | dSP; |
1766 | dSP; |
1767 | |
1767 | |
1768 | ENTER; |
1768 | ENTER; |
1769 | SAVETMPS; |
1769 | SAVETMPS; |
1770 | |
1770 | |
… | |
… | |
2331 | if (PL_op->op_ppaddr != PL_ppaddr [OP_ENTERSUB] |
2331 | if (PL_op->op_ppaddr != PL_ppaddr [OP_ENTERSUB] |
2332 | && PL_op->op_ppaddr != pp_slf) |
2332 | && PL_op->op_ppaddr != pp_slf) |
2333 | croak ("FATAL: Coro SLF calls can only be made normally, not via goto or any other means, caught"); |
2333 | croak ("FATAL: Coro SLF calls can only be made normally, not via goto or any other means, caught"); |
2334 | |
2334 | |
2335 | CvFLAGS (cv) |= CVf_SLF; |
2335 | CvFLAGS (cv) |= CVf_SLF; |
|
|
2336 | CvNODEBUG_on (cv); |
2336 | CvXSUBANY (cv).any_ptr = (void *)init_cb; |
2337 | CvXSUBANY (cv).any_ptr = (void *)init_cb; |
2337 | slf_cv = cv; |
2338 | slf_cv = cv; |
2338 | |
2339 | |
2339 | /* we patch the op, and then re-run the whole call */ |
2340 | /* we patch the op, and then re-run the whole call */ |
2340 | /* we have to put the same argument on the stack for this to work */ |
2341 | /* we have to put the same argument on the stack for this to work */ |
… | |
… | |
2918 | #endif |
2919 | #endif |
2919 | |
2920 | |
2920 | /*****************************************************************************/ |
2921 | /*****************************************************************************/ |
2921 | |
2922 | |
2922 | static SV * |
2923 | static SV * |
2923 | coro_new (HV *stash, SV **argv, int argc, int is_coro) |
2924 | coro_new (pTHX_ HV *stash, SV **argv, int argc, int is_coro) |
2924 | { |
2925 | { |
2925 | SV *coro_sv; |
2926 | SV *coro_sv; |
2926 | struct coro *coro; |
2927 | struct coro *coro; |
2927 | MAGIC *mg; |
2928 | MAGIC *mg; |
2928 | HV *hv; |
2929 | HV *hv; |
… | |
… | |
3054 | SV * |
3055 | SV * |
3055 | new (SV *klass, ...) |
3056 | new (SV *klass, ...) |
3056 | ALIAS: |
3057 | ALIAS: |
3057 | Coro::new = 1 |
3058 | Coro::new = 1 |
3058 | CODE: |
3059 | CODE: |
3059 | RETVAL = coro_new (ix ? coro_stash : coro_state_stash, &ST (1), items - 1, ix); |
3060 | RETVAL = coro_new (aTHX_ ix ? coro_stash : coro_state_stash, &ST (1), items - 1, ix); |
3060 | OUTPUT: |
3061 | OUTPUT: |
3061 | RETVAL |
3062 | RETVAL |
3062 | |
3063 | |
3063 | void |
3064 | void |
3064 | transfer (...) |
3065 | transfer (...) |
… | |
… | |
3332 | sv_idle = coro_get_sv (aTHX_ "Coro::idle" , TRUE); |
3333 | sv_idle = coro_get_sv (aTHX_ "Coro::idle" , TRUE); |
3333 | |
3334 | |
3334 | sv_async_pool_idle = newSVpv ("[async pool idle]", 0); SvREADONLY_on (sv_async_pool_idle); |
3335 | sv_async_pool_idle = newSVpv ("[async pool idle]", 0); SvREADONLY_on (sv_async_pool_idle); |
3335 | sv_Coro = newSVpv ("Coro", 0); SvREADONLY_on (sv_Coro); |
3336 | sv_Coro = newSVpv ("Coro", 0); SvREADONLY_on (sv_Coro); |
3336 | cv_pool_handler = get_cv ("Coro::pool_handler", GV_ADD); SvREADONLY_on (cv_pool_handler); |
3337 | cv_pool_handler = get_cv ("Coro::pool_handler", GV_ADD); SvREADONLY_on (cv_pool_handler); |
3337 | cv_coro_state_new = get_cv ("Coro::State::new", 0); SvREADONLY_on (cv_coro_state_new); |
3338 | CvNODEBUG_on (get_cv ("Coro::_pool_handler", 0)); /* work around a debugger bug */ |
3338 | |
3339 | |
3339 | coro_stash = gv_stashpv ("Coro", TRUE); |
3340 | coro_stash = gv_stashpv ("Coro", TRUE); |
3340 | |
3341 | |
3341 | newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (CORO_PRIO_MAX)); |
3342 | newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (CORO_PRIO_MAX)); |
3342 | newCONSTSUB (coro_stash, "PRIO_HIGH", newSViv (CORO_PRIO_HIGH)); |
3343 | newCONSTSUB (coro_stash, "PRIO_HIGH", newSViv (CORO_PRIO_HIGH)); |
3343 | newCONSTSUB (coro_stash, "PRIO_NORMAL", newSViv (CORO_PRIO_NORMAL)); |
3344 | newCONSTSUB (coro_stash, "PRIO_NORMAL", newSViv (CORO_PRIO_NORMAL)); |
… | |
… | |
3365 | |
3366 | |
3366 | SV * |
3367 | SV * |
3367 | async (...) |
3368 | async (...) |
3368 | PROTOTYPE: &@ |
3369 | PROTOTYPE: &@ |
3369 | CODE: |
3370 | CODE: |
3370 | RETVAL = coro_new (coro_stash, &ST (0), items, 1); |
3371 | RETVAL = coro_new (aTHX_ coro_stash, &ST (0), items, 1); |
3371 | api_ready (RETVAL); |
3372 | api_ready (aTHX_ RETVAL); |
3372 | OUTPUT: |
3373 | OUTPUT: |
3373 | RETVAL |
3374 | RETVAL |
3374 | |
3375 | |
3375 | void |
3376 | void |
3376 | terminate (...) |
3377 | terminate (...) |
… | |
… | |
3496 | for (i = 1; i < items; ++i) |
3497 | for (i = 1; i < items; ++i) |
3497 | av_push (av, SvREFCNT_inc_NN (ST (i))); |
3498 | av_push (av, SvREFCNT_inc_NN (ST (i))); |
3498 | |
3499 | |
3499 | if ((SV *)hv == &PL_sv_undef) |
3500 | if ((SV *)hv == &PL_sv_undef) |
3500 | { |
3501 | { |
3501 | PUSHMARK (SP); |
3502 | SV *sv = coro_new (aTHX_ coro_stash, (SV **)&cv_pool_handler, 1, 1); |
3502 | EXTEND (SP, 2); |
|
|
3503 | PUSHs (sv_Coro); |
|
|
3504 | PUSHs ((SV *)cv_pool_handler); |
|
|
3505 | PUTBACK; |
|
|
3506 | call_sv ((SV *)cv_coro_state_new, G_SCALAR); |
|
|
3507 | SPAGAIN; |
|
|
3508 | |
|
|
3509 | hv = (HV *)SvREFCNT_inc_NN (SvRV (POPs)); |
3503 | hv = (HV *)SvREFCNT_inc_NN (SvRV (sv)); |
|
|
3504 | SvREFCNT_dec (sv); |
3510 | } |
3505 | } |
3511 | |
3506 | |
3512 | { |
3507 | { |
3513 | struct coro *coro = SvSTATE_hv (hv); |
3508 | struct coro *coro = SvSTATE_hv (hv); |
3514 | |
3509 | |