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.233 by root, Fri May 9 22:04:37 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 *
1811 1856
1812void 1857void
1813api_trace (SV *coro, int flags = CC_TRACE | CC_TRACE_SUB) 1858api_trace (SV *coro, int flags = CC_TRACE | CC_TRACE_SUB)
1814 1859
1815SV * 1860SV *
1816has_stack (Coro::State coro) 1861has_cctx (Coro::State coro)
1817 PROTOTYPE: $ 1862 PROTOTYPE: $
1818 CODE: 1863 CODE:
1819 RETVAL = boolSV (!!coro->cctx); 1864 RETVAL = boolSV (!!coro->cctx);
1820 OUTPUT: 1865 OUTPUT:
1821 RETVAL 1866 RETVAL
1901void 1946void
1902_set_readyhook (SV *hook) 1947_set_readyhook (SV *hook)
1903 PROTOTYPE: $ 1948 PROTOTYPE: $
1904 CODE: 1949 CODE:
1905 LOCK; 1950 LOCK;
1906 if (coro_readyhook)
1907 SvREFCNT_dec (coro_readyhook); 1951 SvREFCNT_dec (coro_readyhook);
1908 coro_readyhook = SvOK (hook) ? newSVsv (hook) : 0; 1952 coro_readyhook = SvOK (hook) ? newSVsv (hook) : 0;
1909 UNLOCK; 1953 UNLOCK;
1910 1954
1911int 1955int
1912prio (Coro::State coro, int newprio = 0) 1956prio (Coro::State coro, int newprio = 0)
1981 AV *invoke_av; 2025 AV *invoke_av;
1982 int i, len; 2026 int i, len;
1983 2027
1984 if (!invoke) 2028 if (!invoke)
1985 { 2029 {
1986 SvREFCNT_dec (PL_diehook); PL_diehook = 0; 2030 SV *old = PL_diehook;
2031 PL_diehook = 0;
2032 SvREFCNT_dec (old);
1987 croak ("\3async_pool terminate\2\n"); 2033 croak ("\3async_pool terminate\2\n");
1988 } 2034 }
1989 2035
1990 SvREFCNT_dec (coro->saved_deffh); 2036 SvREFCNT_dec (coro->saved_deffh);
1991 coro->saved_deffh = SvREFCNT_inc ((SV *)PL_defoutgv); 2037 coro->saved_deffh = SvREFCNT_inc ((SV *)PL_defoutgv);
2020 coro->saved_deffh = 0; 2066 coro->saved_deffh = 0;
2021 2067
2022 if (coro_rss (aTHX_ coro) > SvIV (sv_pool_rss) 2068 if (coro_rss (aTHX_ coro) > SvIV (sv_pool_rss)
2023 || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size)) 2069 || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size))
2024 { 2070 {
2025 SvREFCNT_dec (PL_diehook); PL_diehook = 0; 2071 SV *old = PL_diehook;
2072 PL_diehook = 0;
2073 SvREFCNT_dec (old);
2026 croak ("\3async_pool terminate\2\n"); 2074 croak ("\3async_pool terminate\2\n");
2027 } 2075 }
2028 2076
2029 av_clear (GvAV (PL_defgv)); 2077 av_clear (GvAV (PL_defgv));
2030 hv_store ((HV *)SvRV (coro_current), "desc", sizeof ("desc") - 1, 2078 hv_store ((HV *)SvRV (coro_current), "desc", sizeof ("desc") - 1,
2078 2126
2079BOOT: 2127BOOT:
2080 sv_activity = coro_get_sv (aTHX_ "Coro::AnyEvent::ACTIVITY", TRUE); 2128 sv_activity = coro_get_sv (aTHX_ "Coro::AnyEvent::ACTIVITY", TRUE);
2081 2129
2082SV * 2130SV *
2083_schedule () 2131_schedule (...)
2084 PROTOTYPE: @ 2132 PROTOTYPE: @
2085 CODE: 2133 CODE:
2086{ 2134{
2087 static int incede; 2135 static int incede;
2088 fprintf (stderr, "_schedule\n");//D
2089 2136
2090 api_cede_notself (); 2137 api_cede_notself ();
2091 2138
2092 ++incede; 2139 ++incede;
2093 while (coro_nready >= incede && api_cede ()) 2140 while (coro_nready >= incede && api_cede ())
2096 sv_setsv (sv_activity, &PL_sv_undef); 2143 sv_setsv (sv_activity, &PL_sv_undef);
2097 if (coro_nready >= incede) 2144 if (coro_nready >= incede)
2098 { 2145 {
2099 PUSHMARK (SP); 2146 PUSHMARK (SP);
2100 PUTBACK; 2147 PUTBACK;
2101 fprintf (stderr, "call act %d >= %d\n", coro_nready, incede);//D
2102 call_pv ("Coro::AnyEvent::_activity", G_DISCARD | G_EVAL); 2148 call_pv ("Coro::AnyEvent::_activity", G_DISCARD | G_EVAL);
2103 SPAGAIN; 2149 SPAGAIN;
2104 } 2150 }
2105 2151
2106 --incede; 2152 --incede;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines