ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/State.xs
(Generate patch)

Comparing Coro/Coro/State.xs (file contents):
Revision 1.236 by root, Sat May 10 17:43:41 2008 UTC vs.
Revision 1.240 by root, Sun Jun 29 00:28:17 2008 UTC

683 683
684/** coroutine stack handling ************************************************/ 684/** coroutine stack handling ************************************************/
685 685
686static int (*orig_sigelem_get) (pTHX_ SV *sv, MAGIC *mg); 686static int (*orig_sigelem_get) (pTHX_ SV *sv, MAGIC *mg);
687static int (*orig_sigelem_set) (pTHX_ SV *sv, MAGIC *mg); 687static int (*orig_sigelem_set) (pTHX_ SV *sv, MAGIC *mg);
688static int (*orig_sigelem_clr) (pTHX_ SV *sv, MAGIC *mg);
689
690/* apparently < 5.8.8 */
691#undef MgPV_nolen_const
692#ifndef MgPV_nolen_const
693#define MgPV_nolen_const(mg) (((((int)(mg)->mg_len)) == HEf_SVKEY) ? \
694 SvPV_nolen_const((SV*)((mg)->mg_ptr)) : \
695 (const char*)(mg)->mg_ptr)
696#endif
688 697
689/* 698/*
690 * This overrides the default magic get method of %SIG elements. 699 * This overrides the default magic get method of %SIG elements.
691 * The original one doesn't provide for reading back of PL_diehook/PL_warnhook 700 * The original one doesn't provide for reading back of PL_diehook/PL_warnhook
692 * and instead of tryign to save and restore the hash elements, we just provide 701 * and instead of tryign to save and restore the hash elements, we just provide
700{ 709{
701 const char *s = MgPV_nolen_const (mg); 710 const char *s = MgPV_nolen_const (mg);
702 711
703 if (*s == '_') 712 if (*s == '_')
704 { 713 {
705 if (strEQ (s, "__DIE__" ) && PL_diehook ) return sv_setsv (sv, PL_diehook ), 0; 714 SV **svp = 0;
706 if (strEQ (s, "__WARN__") && PL_warnhook) return sv_setsv (sv, PL_warnhook), 0; 715
716 if (strEQ (s, "__DIE__" )) svp = &PL_diehook;
717 if (strEQ (s, "__WARN__")) svp = &PL_warnhook;
718
719 if (svp)
720 {
721 sv_setsv (sv, *svp ? *svp : &PL_sv_undef);
722 return 0;
723 }
707 } 724 }
708 725
709 return orig_sigelem_get ? orig_sigelem_get (aTHX_ sv, mg) : 0; 726 return orig_sigelem_get ? orig_sigelem_get (aTHX_ sv, mg) : 0;
727}
728
729static int
730coro_sigelem_clr (pTHX_ SV *sv, MAGIC *mg)
731{
732 const char *s = MgPV_nolen_const (mg);
733
734 if (*s == '_')
735 {
736 SV **svp = 0;
737
738 if (strEQ (s, "__DIE__" )) svp = &PL_diehook;
739 if (strEQ (s, "__WARN__")) svp = &PL_warnhook;
740
741 if (svp)
742 {
743 SV *old = *svp;
744 *svp = 0;
745 SvREFCNT_dec (old);
746 return 0;
747 }
748 }
749
750 return orig_sigelem_clr ? orig_sigelem_clr (aTHX_ sv, mg) : 0;
710} 751}
711 752
712static int 753static int
713coro_sigelem_set (pTHX_ SV *sv, MAGIC *mg) 754coro_sigelem_set (pTHX_ SV *sv, MAGIC *mg)
714{ 755{
1383static int 1424static int
1384api_ready (SV *coro_sv) 1425api_ready (SV *coro_sv)
1385{ 1426{
1386 dTHX; 1427 dTHX;
1387 struct coro *coro; 1428 struct coro *coro;
1388 SV *hook; 1429 SV *sv_hook;
1430 void (*xs_hook)(void);
1389 1431
1390 if (SvROK (coro_sv)) 1432 if (SvROK (coro_sv))
1391 coro_sv = SvRV (coro_sv); 1433 coro_sv = SvRV (coro_sv);
1392 1434
1393 coro = SvSTATE (coro_sv); 1435 coro = SvSTATE (coro_sv);
1397 1439
1398 coro->flags |= CF_READY; 1440 coro->flags |= CF_READY;
1399 1441
1400 LOCK; 1442 LOCK;
1401 1443
1402 hook = coro_nready ? 0 : coro_readyhook; 1444 sv_hook = coro_nready ? 0 : coro_readyhook;
1445 xs_hook = coro_nready ? 0 : coroapi.readyhook;
1403 1446
1404 coro_enq (aTHX_ SvREFCNT_inc (coro_sv)); 1447 coro_enq (aTHX_ SvREFCNT_inc (coro_sv));
1405 ++coro_nready; 1448 ++coro_nready;
1406 1449
1407 UNLOCK; 1450 UNLOCK;
1408 1451
1409 if (hook) 1452 if (sv_hook)
1410 { 1453 {
1411 dSP; 1454 dSP;
1412 1455
1413 ENTER; 1456 ENTER;
1414 SAVETMPS; 1457 SAVETMPS;
1415 1458
1416 PUSHMARK (SP); 1459 PUSHMARK (SP);
1417 PUTBACK; 1460 PUTBACK;
1418 call_sv (hook, G_DISCARD); 1461 call_sv (sv_hook, G_DISCARD);
1419 SPAGAIN; 1462 SPAGAIN;
1420 1463
1421 FREETMPS; 1464 FREETMPS;
1422 LEAVE; 1465 LEAVE;
1423 } 1466 }
1467
1468 if (xs_hook)
1469 xs_hook ();
1424 1470
1425 return 1; 1471 return 1;
1426} 1472}
1427 1473
1428static int 1474static int
1592 BOOT_PAGESIZE; 1638 BOOT_PAGESIZE;
1593 1639
1594 irsgv = gv_fetchpv ("/" , GV_ADD|GV_NOTQUAL, SVt_PV); 1640 irsgv = gv_fetchpv ("/" , GV_ADD|GV_NOTQUAL, SVt_PV);
1595 stdoutgv = gv_fetchpv ("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO); 1641 stdoutgv = gv_fetchpv ("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO);
1596 1642
1597 orig_sigelem_get = PL_vtbl_sigelem.svt_get; 1643 orig_sigelem_get = PL_vtbl_sigelem.svt_get; PL_vtbl_sigelem.svt_get = coro_sigelem_get;
1598 PL_vtbl_sigelem.svt_get = coro_sigelem_get; 1644 orig_sigelem_set = PL_vtbl_sigelem.svt_set; PL_vtbl_sigelem.svt_set = coro_sigelem_set;
1599 orig_sigelem_set = PL_vtbl_sigelem.svt_set; 1645 orig_sigelem_clr = PL_vtbl_sigelem.svt_clear; PL_vtbl_sigelem.svt_clear = coro_sigelem_clr;
1600 PL_vtbl_sigelem.svt_set = coro_sigelem_set;
1601 1646
1602 hv_sig = coro_get_hv (aTHX_ "SIG", TRUE); 1647 hv_sig = coro_get_hv (aTHX_ "SIG", TRUE);
1603 rv_diehook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV)); 1648 rv_diehook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV));
1604 rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV)); 1649 rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV));
1605 1650
1614 main_top_env = PL_top_env; 1659 main_top_env = PL_top_env;
1615 1660
1616 while (main_top_env->je_prev) 1661 while (main_top_env->je_prev)
1617 main_top_env = main_top_env->je_prev; 1662 main_top_env = main_top_env->je_prev;
1618 1663
1619 coroapi.ver = CORO_API_VERSION; 1664 coroapi.ver = CORO_API_VERSION;
1620 coroapi.rev = CORO_API_REVISION; 1665 coroapi.rev = CORO_API_REVISION;
1621 coroapi.transfer = api_transfer; 1666 coroapi.transfer = api_transfer;
1622 1667
1623 assert (("PRIO_NORMAL must be 0", !PRIO_NORMAL)); 1668 assert (("PRIO_NORMAL must be 0", !PRIO_NORMAL));
1624} 1669}
1625 1670
1626SV * 1671SV *
1980 AV *invoke_av; 2025 AV *invoke_av;
1981 int i, len; 2026 int i, len;
1982 2027
1983 if (!invoke) 2028 if (!invoke)
1984 { 2029 {
1985 SvREFCNT_dec (PL_diehook); PL_diehook = 0; 2030 SV *old = PL_diehook;
2031 PL_diehook = 0;
2032 SvREFCNT_dec (old);
1986 croak ("\3async_pool terminate\2\n"); 2033 croak ("\3async_pool terminate\2\n");
1987 } 2034 }
1988 2035
1989 SvREFCNT_dec (coro->saved_deffh); 2036 SvREFCNT_dec (coro->saved_deffh);
1990 coro->saved_deffh = SvREFCNT_inc ((SV *)PL_defoutgv); 2037 coro->saved_deffh = SvREFCNT_inc ((SV *)PL_defoutgv);
2019 coro->saved_deffh = 0; 2066 coro->saved_deffh = 0;
2020 2067
2021 if (coro_rss (aTHX_ coro) > SvIV (sv_pool_rss) 2068 if (coro_rss (aTHX_ coro) > SvIV (sv_pool_rss)
2022 || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size)) 2069 || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size))
2023 { 2070 {
2024 SvREFCNT_dec (PL_diehook); PL_diehook = 0; 2071 SV *old = PL_diehook;
2072 PL_diehook = 0;
2073 SvREFCNT_dec (old);
2025 croak ("\3async_pool terminate\2\n"); 2074 croak ("\3async_pool terminate\2\n");
2026 } 2075 }
2027 2076
2028 av_clear (GvAV (PL_defgv)); 2077 av_clear (GvAV (PL_defgv));
2029 hv_store ((HV *)SvRV (coro_current), "desc", sizeof ("desc") - 1, 2078 hv_store ((HV *)SvRV (coro_current), "desc", sizeof ("desc") - 1,
2077 2126
2078BOOT: 2127BOOT:
2079 sv_activity = coro_get_sv (aTHX_ "Coro::AnyEvent::ACTIVITY", TRUE); 2128 sv_activity = coro_get_sv (aTHX_ "Coro::AnyEvent::ACTIVITY", TRUE);
2080 2129
2081SV * 2130SV *
2082_schedule () 2131_schedule (...)
2083 PROTOTYPE: @ 2132 PROTOTYPE: @
2084 CODE: 2133 CODE:
2085{ 2134{
2086 static int incede; 2135 static int incede;
2087 2136

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines