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.199 by root, Sun Oct 7 13:53:37 2007 UTC vs.
Revision 1.200 by root, Sun Oct 7 15:08:23 2007 UTC

130#else 130#else
131# define LOCK (void)0 131# define LOCK (void)0
132# define UNLOCK (void)0 132# define UNLOCK (void)0
133#endif 133#endif
134 134
135#define strpair(const) const, sizeof (const) - 1
136
135/* helper storage struct for Coro::AIO */ 137/* helper storage struct for Coro::AIO */
136struct io_state 138struct io_state
137{ 139{
138 int errorno; 140 int errorno;
139 I32 laststype; 141 I32 laststype;
148static HV *coro_state_stash, *coro_stash; 150static HV *coro_state_stash, *coro_stash;
149static SV *coro_mortal; /* will be freed after next transfer */ 151static SV *coro_mortal; /* will be freed after next transfer */
150 152
151static GV *irsgv; /* $/ */ 153static GV *irsgv; /* $/ */
152static GV *stdoutgv; /* *STDOUT */ 154static GV *stdoutgv; /* *STDOUT */
155
156static HV *hv_sig; /* %SIG */
153static SV *sv_diehook; 157static SV *sv_diehook;
154static SV *sv_warnhook; 158static SV *sv_warnhook;
155 159
156/* async_pool helper stuff */ 160/* async_pool helper stuff */
157static SV *sv_pool_rss; 161static SV *sv_pool_rss;
267 get_sv (name, create); 271 get_sv (name, create);
268#endif 272#endif
269 return get_sv (name, create); 273 return get_sv (name, create);
270} 274}
271 275
272static SV * 276static AV *
273coro_get_av (const char *name, int create) 277coro_get_av (const char *name, int create)
274{ 278{
275#if PERL_VERSION_ATLEAST (5,9,0) 279#if PERL_VERSION_ATLEAST (5,9,0)
276 /* silence stupid and wrong 5.10 warning that I am unable to switch off */ 280 /* silence stupid and wrong 5.10 warning that I am unable to switch off */
277 get_av (name, create); 281 get_av (name, create);
278#endif 282#endif
279 return get_av (name, create); 283 return get_av (name, create);
284}
285
286static HV *
287coro_get_hv (const char *name, int create)
288{
289#if PERL_VERSION_ATLEAST (5,9,0)
290 /* silence stupid and wrong 5.10 warning that I am unable to switch off */
291 get_hv (name, create);
292#endif
293 return get_hv (name, create);
280} 294}
281 295
282static AV * 296static AV *
283coro_clone_padlist (pTHX_ CV *cv) 297coro_clone_padlist (pTHX_ CV *cv)
284{ 298{
671 PL_curpm = 0; 685 PL_curpm = 0;
672 PL_curpad = 0; 686 PL_curpad = 0;
673 PL_localizing = 0; 687 PL_localizing = 0;
674 PL_dirty = 0; 688 PL_dirty = 0;
675 PL_restartop = 0; 689 PL_restartop = 0;
676 PL_diehook = SvREFCNT_inc (sv_diehook); 690 SvREFCNT_inc (PL_diehook ); hv_store (hv_sig, strpair ("__DIE__" ), SvREFCNT_inc (sv_diehook ), 0);
677 PL_warnhook = SvREFCNT_inc (sv_warnhook); 691 SvREFCNT_inc (PL_warnhook); hv_store (hv_sig, strpair ("__WARN__"), SvREFCNT_inc (sv_warnhook), 0);
678 692
679 GvSV (PL_defgv) = newSV (0); 693 GvSV (PL_defgv) = newSV (0);
680 GvAV (PL_defgv) = coro->args; coro->args = 0; 694 GvAV (PL_defgv) = coro->args; coro->args = 0;
681 GvSV (PL_errgv) = newSV (0); 695 GvSV (PL_errgv) = newSV (0);
682 GvSV (irsgv) = newSVpvn ("\n", 1); sv_magic (GvSV (irsgv), (SV *)irsgv, PERL_MAGIC_sv, "/", 0); 696 GvSV (irsgv) = newSVpvn ("\n", 1); sv_magic (GvSV (irsgv), (SV *)irsgv, PERL_MAGIC_sv, "/", 0);
791 PUSHMARK (SP); 805 PUSHMARK (SP);
792 PUSHs (&PL_sv_no); 806 PUSHs (&PL_sv_no);
793 PUSHs (fullname); 807 PUSHs (fullname);
794 PUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 808 PUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
795 PUTBACK; 809 PUTBACK;
796 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0); 810 cb = hv_fetch ((HV *)SvRV (coro_current), strpair ("_trace_sub_cb"), 0);
797 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); 811 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD);
798 SPAGAIN; 812 SPAGAIN;
799 FREETMPS; 813 FREETMPS;
800 LEAVE; 814 LEAVE;
801 PL_runops = runops_trace; 815 PL_runops = runops_trace;
830 PUSHMARK (SP); 844 PUSHMARK (SP);
831 PUSHs (&PL_sv_yes); 845 PUSHs (&PL_sv_yes);
832 PUSHs (fullname); 846 PUSHs (fullname);
833 PUSHs (cx->blk_sub.hasargs ? sv_2mortal (newRV_inc ((SV *)cx->blk_sub.argarray)) : &PL_sv_undef); 847 PUSHs (cx->blk_sub.hasargs ? sv_2mortal (newRV_inc ((SV *)cx->blk_sub.argarray)) : &PL_sv_undef);
834 PUTBACK; 848 PUTBACK;
835 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0); 849 cb = hv_fetch ((HV *)SvRV (coro_current), strpair ("_trace_sub_cb"), 0);
836 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); 850 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD);
837 SPAGAIN; 851 SPAGAIN;
838 FREETMPS; 852 FREETMPS;
839 LEAVE; 853 LEAVE;
840 PL_runops = runops_trace; 854 PL_runops = runops_trace;
854 PL_runops = RUNOPS_DEFAULT; 868 PL_runops = RUNOPS_DEFAULT;
855 PUSHMARK (SP); 869 PUSHMARK (SP);
856 PUSHs (sv_2mortal (newSVpv (OutCopFILE (oldcop), 0))); 870 PUSHs (sv_2mortal (newSVpv (OutCopFILE (oldcop), 0)));
857 PUSHs (sv_2mortal (newSViv (CopLINE (oldcop)))); 871 PUSHs (sv_2mortal (newSViv (CopLINE (oldcop))));
858 PUTBACK; 872 PUTBACK;
859 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_line_cb", sizeof ("_trace_line_cb") - 1, 0); 873 cb = hv_fetch ((HV *)SvRV (coro_current), strpair ("_trace_line_cb"), 0);
860 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); 874 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD);
861 SPAGAIN; 875 SPAGAIN;
862 FREETMPS; 876 FREETMPS;
863 LEAVE; 877 LEAVE;
864 PL_runops = runops_trace; 878 PL_runops = runops_trace;
1487 BOOT_PAGESIZE; 1501 BOOT_PAGESIZE;
1488 1502
1489 irsgv = gv_fetchpv ("/" , GV_ADD|GV_NOTQUAL, SVt_PV); 1503 irsgv = gv_fetchpv ("/" , GV_ADD|GV_NOTQUAL, SVt_PV);
1490 stdoutgv = gv_fetchpv ("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO); 1504 stdoutgv = gv_fetchpv ("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO);
1491 1505
1506 hv_sig = coro_get_hv ("SIG", TRUE);
1492 sv_diehook = coro_get_sv ("Coro::State::DIEHOOK" , TRUE); 1507 sv_diehook = coro_get_sv ("Coro::State::DIEHOOK" , TRUE);
1493 sv_warnhook = coro_get_sv ("Coro::State::WARNHOOK", TRUE); 1508 sv_warnhook = coro_get_sv ("Coro::State::WARNHOOK", TRUE);
1494 1509
1495 if (!PL_diehook) PL_diehook = SvREFCNT_inc (sv_diehook); 1510 if (!PL_diehook ) hv_store (hv_sig, strpair ("__DIE__" ), SvREFCNT_inc (sv_diehook ), 0);
1496 if (!PL_warnhook) PL_warnhook = SvREFCNT_inc (sv_warnhook); 1511 if (!PL_warnhook) hv_store (hv_sig, strpair ("__WARN__"), SvREFCNT_inc (sv_warnhook), 0);
1497 1512
1498 coro_state_stash = gv_stashpv ("Coro::State", TRUE); 1513 coro_state_stash = gv_stashpv ("Coro::State", TRUE);
1499 1514
1500 newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE)); 1515 newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE));
1501 newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB)); 1516 newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB));
1828 CODE: 1843 CODE:
1829{ 1844{
1830 struct coro *coro = SvSTATE (coro_current); 1845 struct coro *coro = SvSTATE (coro_current);
1831 HV *hv = (HV *)SvRV (coro_current); 1846 HV *hv = (HV *)SvRV (coro_current);
1832 AV *defav = GvAV (PL_defgv); 1847 AV *defav = GvAV (PL_defgv);
1833 SV *invoke = hv_delete (hv, "_invoke", sizeof ("_invoke") - 1, 0); 1848 SV *invoke = hv_delete (hv, strpair ("_invoke"), 0);
1834 AV *invoke_av; 1849 AV *invoke_av;
1835 int i, len; 1850 int i, len;
1836 1851
1837 if (!invoke) 1852 if (!invoke)
1838 croak ("\3async_pool terminate\2\n"); 1853 croak ("\3async_pool terminate\2\n");
1839 1854
1840 SvREFCNT_dec (coro->saved_deffh); 1855 SvREFCNT_dec (coro->saved_deffh);
1841 coro->saved_deffh = SvREFCNT_inc ((SV *)PL_defoutgv); 1856 coro->saved_deffh = SvREFCNT_inc ((SV *)PL_defoutgv);
1842 1857
1843 hv_store (hv, "desc", sizeof ("desc") - 1, 1858 hv_store (hv, "desc", sizeof ("desc") - 1,
1844 newSVpvn ("[async_pool]", sizeof ("[async_pool]") - 1), 0); 1859 newSVpvn (strpair ("[async_pool]")), 0);
1845 1860
1846 invoke_av = (AV *)SvRV (invoke); 1861 invoke_av = (AV *)SvRV (invoke);
1847 len = av_len (invoke_av); 1862 len = av_len (invoke_av);
1848 1863
1849 sv_setsv (cb, AvARRAY (invoke_av)[0]); 1864 sv_setsv (cb, AvARRAY (invoke_av)[0]);
1872 if (coro_rss (aTHX_ coro) > SvIV (sv_pool_rss) 1887 if (coro_rss (aTHX_ coro) > SvIV (sv_pool_rss)
1873 || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size)) 1888 || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size))
1874 croak ("\3async_pool terminate\2\n"); 1889 croak ("\3async_pool terminate\2\n");
1875 1890
1876 av_clear (GvAV (PL_defgv)); 1891 av_clear (GvAV (PL_defgv));
1877 hv_store ((HV *)SvRV (coro_current), "desc", sizeof ("desc") - 1, 1892 hv_store ((HV *)SvRV (coro_current), strpair ("desc"),
1878 newSVpvn ("[async_pool idle]", sizeof ("[async_pool idle]") - 1), 0); 1893 newSVpvn (strpair ("[async_pool idle]")), 0);
1879 1894
1880 coro->prio = 0; 1895 coro->prio = 0;
1881 1896
1882 if (coro->cctx && (coro->cctx->flags & CC_TRACE)) 1897 if (coro->cctx && (coro->cctx->flags & CC_TRACE))
1883 api_trace (coro_current, 0); 1898 api_trace (coro_current, 0);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines