… | |
… | |
148 | static HV *coro_state_stash, *coro_stash; |
148 | static HV *coro_state_stash, *coro_stash; |
149 | static SV *coro_mortal; /* will be freed after next transfer */ |
149 | static SV *coro_mortal; /* will be freed after next transfer */ |
150 | |
150 | |
151 | static GV *irsgv; /* $/ */ |
151 | static GV *irsgv; /* $/ */ |
152 | static GV *stdoutgv; /* *STDOUT */ |
152 | static GV *stdoutgv; /* *STDOUT */ |
|
|
153 | static SV *sv_diehook; |
|
|
154 | static SV *sv_warnhook; |
153 | |
155 | |
154 | /* async_pool helper stuff */ |
156 | /* async_pool helper stuff */ |
155 | static SV *sv_pool_rss; |
157 | static SV *sv_pool_rss; |
156 | static SV *sv_pool_size; |
158 | static SV *sv_pool_size; |
157 | static AV *av_async_pool; |
159 | static AV *av_async_pool; |
… | |
… | |
254 | static AV *coro_ready [PRIO_MAX-PRIO_MIN+1]; |
256 | static AV *coro_ready [PRIO_MAX-PRIO_MIN+1]; |
255 | static int coro_nready; |
257 | static int coro_nready; |
256 | static struct coro *coro_first; |
258 | static struct coro *coro_first; |
257 | |
259 | |
258 | /** lowlevel stuff **********************************************************/ |
260 | /** lowlevel stuff **********************************************************/ |
|
|
261 | |
|
|
262 | static SV * |
|
|
263 | coro_get_sv (const char *name, int create) |
|
|
264 | { |
|
|
265 | #if PERL_VERSION_ATLEAST (5,9,0) |
|
|
266 | /* silence stupid and wrong 5.10 warning that I am unable to switch off */ |
|
|
267 | get_sv (name, create); |
|
|
268 | #endif |
|
|
269 | return get_sv (name, create); |
|
|
270 | } |
|
|
271 | |
|
|
272 | static SV * |
|
|
273 | coro_get_av (const char *name, int create) |
|
|
274 | { |
|
|
275 | #if PERL_VERSION_ATLEAST (5,9,0) |
|
|
276 | /* silence stupid and wrong 5.10 warning that I am unable to switch off */ |
|
|
277 | get_av (name, create); |
|
|
278 | #endif |
|
|
279 | return get_av (name, create); |
|
|
280 | } |
259 | |
281 | |
260 | static AV * |
282 | static AV * |
261 | coro_clone_padlist (pTHX_ CV *cv) |
283 | coro_clone_padlist (pTHX_ CV *cv) |
262 | { |
284 | { |
263 | AV *padlist = CvPADLIST (cv); |
285 | AV *padlist = CvPADLIST (cv); |
… | |
… | |
649 | PL_curpm = 0; |
671 | PL_curpm = 0; |
650 | PL_curpad = 0; |
672 | PL_curpad = 0; |
651 | PL_localizing = 0; |
673 | PL_localizing = 0; |
652 | PL_dirty = 0; |
674 | PL_dirty = 0; |
653 | PL_restartop = 0; |
675 | PL_restartop = 0; |
654 | PL_diehook = 0; |
676 | PL_diehook = SvREFCNT_inc (sv_diehook); |
655 | PL_warnhook = 0; |
677 | PL_warnhook = SvREFCNT_inc (sv_warnhook); |
656 | |
678 | |
657 | GvSV (PL_defgv) = newSV (0); |
679 | GvSV (PL_defgv) = newSV (0); |
658 | GvAV (PL_defgv) = coro->args; coro->args = 0; |
680 | GvAV (PL_defgv) = coro->args; coro->args = 0; |
659 | GvSV (PL_errgv) = newSV (0); |
681 | GvSV (PL_errgv) = newSV (0); |
660 | GvSV (irsgv) = newSVpvn ("\n", 1); sv_magic (GvSV (irsgv), (SV *)irsgv, PERL_MAGIC_sv, "/", 0); |
682 | GvSV (irsgv) = newSVpvn ("\n", 1); sv_magic (GvSV (irsgv), (SV *)irsgv, PERL_MAGIC_sv, "/", 0); |
… | |
… | |
1465 | BOOT_PAGESIZE; |
1487 | BOOT_PAGESIZE; |
1466 | |
1488 | |
1467 | irsgv = gv_fetchpv ("/" , GV_ADD|GV_NOTQUAL, SVt_PV); |
1489 | irsgv = gv_fetchpv ("/" , GV_ADD|GV_NOTQUAL, SVt_PV); |
1468 | stdoutgv = gv_fetchpv ("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO); |
1490 | stdoutgv = gv_fetchpv ("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO); |
1469 | |
1491 | |
|
|
1492 | sv_diehook = coro_get_sv ("Coro::State::DIEHOOK" , TRUE); |
|
|
1493 | sv_warnhook = coro_get_sv ("Coro::State::WARNHOOK", TRUE); |
|
|
1494 | |
|
|
1495 | if (!PL_diehook) PL_diehook = SvREFCNT_inc (sv_diehook); |
|
|
1496 | if (!PL_warnhook) PL_warnhook = SvREFCNT_inc (sv_warnhook); |
|
|
1497 | |
1470 | coro_state_stash = gv_stashpv ("Coro::State", TRUE); |
1498 | coro_state_stash = gv_stashpv ("Coro::State", TRUE); |
1471 | |
1499 | |
1472 | newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE)); |
1500 | newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE)); |
1473 | newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB)); |
1501 | newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB)); |
1474 | newCONSTSUB (coro_state_stash, "CC_TRACE_LINE", newSViv (CC_TRACE_LINE)); |
1502 | newCONSTSUB (coro_state_stash, "CC_TRACE_LINE", newSViv (CC_TRACE_LINE)); |
… | |
… | |
1703 | |
1731 | |
1704 | BOOT: |
1732 | BOOT: |
1705 | { |
1733 | { |
1706 | int i; |
1734 | int i; |
1707 | |
1735 | |
1708 | sv_pool_rss = get_sv ("Coro::POOL_RSS" , TRUE); |
1736 | sv_pool_rss = coro_get_sv ("Coro::POOL_RSS" , TRUE); |
1709 | get_sv ("Coro::POOL_RSS" , TRUE); /* silence stupid 5.10 warning */ |
|
|
1710 | sv_pool_size = get_sv ("Coro::POOL_SIZE" , TRUE); |
1737 | sv_pool_size = coro_get_sv ("Coro::POOL_SIZE" , TRUE); |
1711 | get_sv ("Coro::POOL_SIZE" , TRUE); /* silence stupid 5.10 warning */ |
|
|
1712 | av_async_pool = get_av ("Coro::async_pool", TRUE); |
1738 | av_async_pool = coro_get_av ("Coro::async_pool", TRUE); |
1713 | get_av ("Coro::async_pool", TRUE); /* silence stupid 5.10 warning */ |
|
|
1714 | |
1739 | |
1715 | coro_current = get_sv ("Coro::current", FALSE); |
1740 | coro_current = coro_get_sv ("Coro::current", FALSE); |
1716 | SvREADONLY_on (coro_current); |
1741 | SvREADONLY_on (coro_current); |
1717 | |
1742 | |
1718 | coro_stash = gv_stashpv ("Coro", TRUE); |
1743 | coro_stash = gv_stashpv ("Coro", TRUE); |
1719 | |
1744 | |
1720 | newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (PRIO_MAX)); |
1745 | newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (PRIO_MAX)); |