… | |
… | |
373 | time_init (pTHX) |
373 | time_init (pTHX) |
374 | { |
374 | { |
375 | SV **svp; |
375 | SV **svp; |
376 | |
376 | |
377 | require_pv ("Time/HiRes.pm"); |
377 | require_pv ("Time/HiRes.pm"); |
378 | |
378 | |
379 | svp = hv_fetch (PL_modglobal, "Time::NVtime", 12, 0); |
379 | svp = hv_fetch (PL_modglobal, "Time::NVtime", 12, 0); |
380 | |
380 | |
381 | if (!svp) croak ("Time::HiRes is required, but missing. Caught"); |
381 | if (!svp) croak ("Time::HiRes is required, but missing. Caught"); |
382 | if (!SvIOK (*svp)) croak ("Time::NVtime isn't a function pointer. Caught"); |
382 | if (!SvIOK (*svp)) croak ("Time::NVtime isn't a function pointer. Caught"); |
383 | |
383 | |
… | |
… | |
994 | { |
994 | { |
995 | SV **svp = 0; |
995 | SV **svp = 0; |
996 | |
996 | |
997 | if (strEQ (s, "__DIE__" )) svp = &PL_diehook; |
997 | if (strEQ (s, "__DIE__" )) svp = &PL_diehook; |
998 | if (strEQ (s, "__WARN__")) svp = &PL_warnhook; |
998 | if (strEQ (s, "__WARN__")) svp = &PL_warnhook; |
999 | |
999 | |
1000 | if (svp) |
1000 | if (svp) |
1001 | { |
1001 | { |
1002 | SV *ssv; |
1002 | SV *ssv; |
1003 | |
1003 | |
1004 | if (!*svp) |
1004 | if (!*svp) |
… | |
… | |
1110 | PL_hints = 0; |
1110 | PL_hints = 0; |
1111 | |
1111 | |
1112 | /* recreate the die/warn hooks */ |
1112 | /* recreate the die/warn hooks */ |
1113 | PL_diehook = SvREFCNT_inc (rv_diehook); |
1113 | PL_diehook = SvREFCNT_inc (rv_diehook); |
1114 | PL_warnhook = SvREFCNT_inc (rv_warnhook); |
1114 | PL_warnhook = SvREFCNT_inc (rv_warnhook); |
1115 | |
1115 | |
1116 | GvSV (PL_defgv) = newSV (0); |
1116 | GvSV (PL_defgv) = newSV (0); |
1117 | GvAV (PL_defgv) = coro->args; coro->args = 0; |
1117 | GvAV (PL_defgv) = coro->args; coro->args = 0; |
1118 | GvSV (PL_errgv) = newSV (0); |
1118 | GvSV (PL_errgv) = newSV (0); |
1119 | GvSV (irsgv) = newSVpvn ("\n", 1); sv_magic (GvSV (irsgv), (SV *)irsgv, PERL_MAGIC_sv, "/", 0); |
1119 | GvSV (irsgv) = newSVpvn ("\n", 1); sv_magic (GvSV (irsgv), (SV *)irsgv, PERL_MAGIC_sv, "/", 0); |
1120 | GvHV (PL_hintgv) = 0; |
1120 | GvHV (PL_hintgv) = 0; |
… | |
… | |
1731 | return; |
1731 | return; |
1732 | |
1732 | |
1733 | slf_destroy (aTHX_ coro); |
1733 | slf_destroy (aTHX_ coro); |
1734 | |
1734 | |
1735 | coro->flags |= CF_ZOMBIE; |
1735 | coro->flags |= CF_ZOMBIE; |
1736 | |
1736 | |
1737 | if (coro->flags & CF_READY) |
1737 | if (coro->flags & CF_READY) |
1738 | { |
1738 | { |
1739 | /* reduce nready, as destroying a ready coro effectively unreadies it */ |
1739 | /* reduce nready, as destroying a ready coro effectively unreadies it */ |
1740 | /* alternative: look through all ready queues and remove the coro */ |
1740 | /* alternative: look through all ready queues and remove the coro */ |
1741 | --coro_nready; |
1741 | --coro_nready; |
… | |
… | |
2174 | |
2174 | |
2175 | static void |
2175 | static void |
2176 | coro_set_status (pTHX_ struct coro *coro, SV **arg, int items) |
2176 | coro_set_status (pTHX_ struct coro *coro, SV **arg, int items) |
2177 | { |
2177 | { |
2178 | AV *av; |
2178 | AV *av; |
2179 | |
2179 | |
2180 | if (coro->status) |
2180 | if (coro->status) |
2181 | { |
2181 | { |
2182 | av = coro->status; |
2182 | av = coro->status; |
2183 | av_clear (av); |
2183 | av_clear (av); |
2184 | } |
2184 | } |
… | |
… | |
2231 | |
2231 | |
2232 | coro = SvSTATE (arg [0]); |
2232 | coro = SvSTATE (arg [0]); |
2233 | coro_hv = coro->hv; |
2233 | coro_hv = coro->hv; |
2234 | |
2234 | |
2235 | coro_set_status (aTHX_ coro, arg + 1, items - 1); |
2235 | coro_set_status (aTHX_ coro, arg + 1, items - 1); |
2236 | |
2236 | |
2237 | if (ecb_expect_false (coro->flags & CF_NOCANCEL)) |
2237 | if (ecb_expect_false (coro->flags & CF_NOCANCEL)) |
2238 | { |
2238 | { |
2239 | /* coro currently busy cancelling something, so just notify it */ |
2239 | /* coro currently busy cancelling something, so just notify it */ |
2240 | coro->slf_frame.data = (void *)coro; |
2240 | coro->slf_frame.data = (void *)coro; |
2241 | |
2241 | |
… | |
… | |
2420 | |
2420 | |
2421 | static int |
2421 | static int |
2422 | slf_check_rouse_wait (pTHX_ struct CoroSLF *frame) |
2422 | slf_check_rouse_wait (pTHX_ struct CoroSLF *frame) |
2423 | { |
2423 | { |
2424 | SV *data = (SV *)frame->data; |
2424 | SV *data = (SV *)frame->data; |
2425 | |
2425 | |
2426 | if (CORO_THROW) |
2426 | if (CORO_THROW) |
2427 | return 0; |
2427 | return 0; |
2428 | |
2428 | |
2429 | if (SvTYPE (SvRV (data)) != SVt_PVAV) |
2429 | if (SvTYPE (SvRV (data)) != SVt_PVAV) |
2430 | return 1; |
2430 | return 1; |
… | |
… | |
2466 | cb = sv_2mortal (coro->rouse_cb); |
2466 | cb = sv_2mortal (coro->rouse_cb); |
2467 | coro->rouse_cb = 0; |
2467 | coro->rouse_cb = 0; |
2468 | } |
2468 | } |
2469 | |
2469 | |
2470 | if (!SvROK (cb) |
2470 | if (!SvROK (cb) |
2471 | || SvTYPE (SvRV (cb)) != SVt_PVCV |
2471 | || SvTYPE (SvRV (cb)) != SVt_PVCV |
2472 | || CvXSUB ((CV *)SvRV (cb)) != coro_rouse_callback) |
2472 | || CvXSUB ((CV *)SvRV (cb)) != coro_rouse_callback) |
2473 | croak ("Coro::rouse_wait called with illegal callback argument,"); |
2473 | croak ("Coro::rouse_wait called with illegal callback argument,"); |
2474 | |
2474 | |
2475 | { |
2475 | { |
2476 | CV *cv = (CV *)SvRV (cb); /* for S_GENSUB_ARG */ |
2476 | CV *cv = (CV *)SvRV (cb); /* for S_GENSUB_ARG */ |
… | |
… | |
3816 | |
3816 | |
3817 | sv_async_pool_idle = newSVpv ("[async pool idle]", 0); SvREADONLY_on (sv_async_pool_idle); |
3817 | sv_async_pool_idle = newSVpv ("[async pool idle]", 0); SvREADONLY_on (sv_async_pool_idle); |
3818 | sv_Coro = newSVpv ("Coro", 0); SvREADONLY_on (sv_Coro); |
3818 | sv_Coro = newSVpv ("Coro", 0); SvREADONLY_on (sv_Coro); |
3819 | cv_pool_handler = get_cv ("Coro::pool_handler", GV_ADD); SvREADONLY_on (cv_pool_handler); |
3819 | cv_pool_handler = get_cv ("Coro::pool_handler", GV_ADD); SvREADONLY_on (cv_pool_handler); |
3820 | CvNODEBUG_on (get_cv ("Coro::_pool_handler", 0)); /* work around a debugger bug */ |
3820 | CvNODEBUG_on (get_cv ("Coro::_pool_handler", 0)); /* work around a debugger bug */ |
3821 | |
3821 | |
3822 | coro_stash = gv_stashpv ("Coro", TRUE); |
3822 | coro_stash = gv_stashpv ("Coro", TRUE); |
3823 | |
3823 | |
3824 | newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (CORO_PRIO_MAX)); |
3824 | newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (CORO_PRIO_MAX)); |
3825 | newCONSTSUB (coro_stash, "PRIO_HIGH", newSViv (CORO_PRIO_HIGH)); |
3825 | newCONSTSUB (coro_stash, "PRIO_HIGH", newSViv (CORO_PRIO_HIGH)); |
3826 | newCONSTSUB (coro_stash, "PRIO_NORMAL", newSViv (CORO_PRIO_NORMAL)); |
3826 | newCONSTSUB (coro_stash, "PRIO_NORMAL", newSViv (CORO_PRIO_NORMAL)); |