… | |
… | |
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 */ |
… | |
… | |
2918 | #endif |
2917 | #endif |
2919 | |
2918 | |
2920 | /*****************************************************************************/ |
2919 | /*****************************************************************************/ |
2921 | |
2920 | |
2922 | static SV * |
2921 | static SV * |
2923 | coro_new (HV *stash, SV **argv, int argc, int is_coro) |
2922 | coro_new (pTHX_ HV *stash, SV **argv, int argc, int is_coro) |
2924 | { |
2923 | { |
2925 | SV *coro_sv; |
2924 | SV *coro_sv; |
2926 | struct coro *coro; |
2925 | struct coro *coro; |
2927 | MAGIC *mg; |
2926 | MAGIC *mg; |
2928 | HV *hv; |
2927 | HV *hv; |
… | |
… | |
3054 | SV * |
3053 | SV * |
3055 | new (SV *klass, ...) |
3054 | new (SV *klass, ...) |
3056 | ALIAS: |
3055 | ALIAS: |
3057 | Coro::new = 1 |
3056 | Coro::new = 1 |
3058 | CODE: |
3057 | CODE: |
3059 | RETVAL = coro_new (ix ? coro_stash : coro_state_stash, &ST (1), items - 1, ix); |
3058 | RETVAL = coro_new (aTHX_ ix ? coro_stash : coro_state_stash, &ST (1), items - 1, ix); |
3060 | OUTPUT: |
3059 | OUTPUT: |
3061 | RETVAL |
3060 | RETVAL |
3062 | |
3061 | |
3063 | void |
3062 | void |
3064 | transfer (...) |
3063 | transfer (...) |
… | |
… | |
3332 | sv_idle = coro_get_sv (aTHX_ "Coro::idle" , TRUE); |
3331 | sv_idle = coro_get_sv (aTHX_ "Coro::idle" , TRUE); |
3333 | |
3332 | |
3334 | sv_async_pool_idle = newSVpv ("[async pool idle]", 0); SvREADONLY_on (sv_async_pool_idle); |
3333 | 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); |
3334 | 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); |
3335 | 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 | |
3336 | |
3339 | coro_stash = gv_stashpv ("Coro", TRUE); |
3337 | coro_stash = gv_stashpv ("Coro", TRUE); |
3340 | |
3338 | |
3341 | newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (CORO_PRIO_MAX)); |
3339 | newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (CORO_PRIO_MAX)); |
3342 | newCONSTSUB (coro_stash, "PRIO_HIGH", newSViv (CORO_PRIO_HIGH)); |
3340 | newCONSTSUB (coro_stash, "PRIO_HIGH", newSViv (CORO_PRIO_HIGH)); |
… | |
… | |
3365 | |
3363 | |
3366 | SV * |
3364 | SV * |
3367 | async (...) |
3365 | async (...) |
3368 | PROTOTYPE: &@ |
3366 | PROTOTYPE: &@ |
3369 | CODE: |
3367 | CODE: |
3370 | RETVAL = coro_new (coro_stash, &ST (0), items, 1); |
3368 | RETVAL = coro_new (aTHX_ coro_stash, &ST (0), items, 1); |
3371 | api_ready (RETVAL); |
3369 | api_ready (RETVAL); |
3372 | OUTPUT: |
3370 | OUTPUT: |
3373 | RETVAL |
3371 | RETVAL |
3374 | |
3372 | |
3375 | void |
3373 | void |
… | |
… | |
3496 | for (i = 1; i < items; ++i) |
3494 | for (i = 1; i < items; ++i) |
3497 | av_push (av, SvREFCNT_inc_NN (ST (i))); |
3495 | av_push (av, SvREFCNT_inc_NN (ST (i))); |
3498 | |
3496 | |
3499 | if ((SV *)hv == &PL_sv_undef) |
3497 | if ((SV *)hv == &PL_sv_undef) |
3500 | { |
3498 | { |
3501 | PUSHMARK (SP); |
3499 | 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)); |
3500 | hv = (HV *)SvREFCNT_inc_NN (SvRV (sv)); |
|
|
3501 | SvREFCNT_dec (sv); |
3510 | } |
3502 | } |
3511 | |
3503 | |
3512 | { |
3504 | { |
3513 | struct coro *coro = SvSTATE_hv (hv); |
3505 | struct coro *coro = SvSTATE_hv (hv); |
3514 | |
3506 | |