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.211 by root, Wed Oct 10 03:37:58 2007 UTC vs.
Revision 1.212 by root, Wed Oct 10 04:21:33 2007 UTC

131#else 131#else
132# define LOCK (void)0 132# define LOCK (void)0
133# define UNLOCK (void)0 133# define UNLOCK (void)0
134#endif 134#endif
135 135
136#define strpair(const) const, sizeof (const) - 1
137
138/* helper storage struct for Coro::AIO */ 136/* helper storage struct for Coro::AIO */
139struct io_state 137struct io_state
140{ 138{
141 int errorno; 139 int errorno;
142 I32 laststype; 140 I32 laststype;
453 451
454 #define VAR(name,type) PL_ ## name = slot->name; 452 #define VAR(name,type) PL_ ## name = slot->name;
455 # include "state.h" 453 # include "state.h"
456 #undef VAR 454 #undef VAR
457 455
458 /*hv_store (hv_sig, strpair ("__DIE__" ), SvREFCNT_inc (sv_diehook ), 0);*/ 456 /*hv_store (hv_sig, "__DIE__" , sizeof ("__DIE__" ) - 1, SvREFCNT_inc (sv_diehook ), 0);*/
459 /*hv_store (hv_sig, strpair ("__WARN__"), SvREFCNT_inc (sv_warnhook), 0);*/ 457 /*hv_store (hv_sig, "__WARN__", sizeof ("__WARN__") - 1, SvREFCNT_inc (sv_warnhook), 0);*/
460 458
461 { 459 {
462 dSP; 460 dSP;
463 461
464 CV *cv; 462 CV *cv;
687 PL_curpm = 0; 685 PL_curpm = 0;
688 PL_curpad = 0; 686 PL_curpad = 0;
689 PL_localizing = 0; 687 PL_localizing = 0;
690 PL_dirty = 0; 688 PL_dirty = 0;
691 PL_restartop = 0; 689 PL_restartop = 0;
692 PL_diehook = 0; hv_store (hv_sig, strpair ("__DIE__" ), SvREFCNT_inc (sv_diehook ), 0); 690 PL_diehook = 0; hv_store (hv_sig, "__DIE__" , sizeof ("__DIE__" ) - 1, SvREFCNT_inc (sv_diehook ), 0);
693 PL_warnhook = 0; hv_store (hv_sig, strpair ("__WARN__"), SvREFCNT_inc (sv_warnhook), 0); 691 PL_warnhook = 0; hv_store (hv_sig, "__WARN__", sizeof ("__WARN__") - 1, SvREFCNT_inc (sv_warnhook), 0);
694 692
695 GvSV (PL_defgv) = newSV (0); 693 GvSV (PL_defgv) = newSV (0);
696 GvAV (PL_defgv) = coro->args; coro->args = 0; 694 GvAV (PL_defgv) = coro->args; coro->args = 0;
697 GvSV (PL_errgv) = newSV (0); 695 GvSV (PL_errgv) = newSV (0);
698 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);
812 PUSHMARK (SP); 810 PUSHMARK (SP);
813 PUSHs (&PL_sv_no); 811 PUSHs (&PL_sv_no);
814 PUSHs (fullname); 812 PUSHs (fullname);
815 PUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 813 PUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
816 PUTBACK; 814 PUTBACK;
817 cb = hv_fetch ((HV *)SvRV (coro_current), strpair ("_trace_sub_cb"), 0); 815 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0);
818 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); 816 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD);
819 SPAGAIN; 817 SPAGAIN;
820 FREETMPS; 818 FREETMPS;
821 LEAVE; 819 LEAVE;
822 PL_runops = runops_trace; 820 PL_runops = runops_trace;
851 PUSHMARK (SP); 849 PUSHMARK (SP);
852 PUSHs (&PL_sv_yes); 850 PUSHs (&PL_sv_yes);
853 PUSHs (fullname); 851 PUSHs (fullname);
854 PUSHs (cx->blk_sub.hasargs ? sv_2mortal (newRV_inc ((SV *)cx->blk_sub.argarray)) : &PL_sv_undef); 852 PUSHs (cx->blk_sub.hasargs ? sv_2mortal (newRV_inc ((SV *)cx->blk_sub.argarray)) : &PL_sv_undef);
855 PUTBACK; 853 PUTBACK;
856 cb = hv_fetch ((HV *)SvRV (coro_current), strpair ("_trace_sub_cb"), 0); 854 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0);
857 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); 855 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD);
858 SPAGAIN; 856 SPAGAIN;
859 FREETMPS; 857 FREETMPS;
860 LEAVE; 858 LEAVE;
861 PL_runops = runops_trace; 859 PL_runops = runops_trace;
875 PL_runops = RUNOPS_DEFAULT; 873 PL_runops = RUNOPS_DEFAULT;
876 PUSHMARK (SP); 874 PUSHMARK (SP);
877 PUSHs (sv_2mortal (newSVpv (OutCopFILE (oldcop), 0))); 875 PUSHs (sv_2mortal (newSVpv (OutCopFILE (oldcop), 0)));
878 PUSHs (sv_2mortal (newSViv (CopLINE (oldcop)))); 876 PUSHs (sv_2mortal (newSViv (CopLINE (oldcop))));
879 PUTBACK; 877 PUTBACK;
880 cb = hv_fetch ((HV *)SvRV (coro_current), strpair ("_trace_line_cb"), 0); 878 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_line_cb", sizeof ("_trace_line_cb") - 1, 0);
881 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); 879 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD);
882 SPAGAIN; 880 SPAGAIN;
883 FREETMPS; 881 FREETMPS;
884 LEAVE; 882 LEAVE;
885 PL_runops = runops_trace; 883 PL_runops = runops_trace;
1512 1510
1513 hv_sig = coro_get_hv ("SIG", TRUE); 1511 hv_sig = coro_get_hv ("SIG", TRUE);
1514 sv_diehook = coro_get_sv ("Coro::State::DIEHOOK" , TRUE); 1512 sv_diehook = coro_get_sv ("Coro::State::DIEHOOK" , TRUE);
1515 sv_warnhook = coro_get_sv ("Coro::State::WARNHOOK", TRUE); 1513 sv_warnhook = coro_get_sv ("Coro::State::WARNHOOK", TRUE);
1516 1514
1517 if (!PL_diehook ) hv_store (hv_sig, strpair ("__DIE__" ), SvREFCNT_inc (sv_diehook ), 0); 1515 if (!PL_diehook ) hv_store (hv_sig, "__DIE__" , sizeof ("__DIE__" ) - 1, SvREFCNT_inc (sv_diehook ), 0);
1518 if (!PL_warnhook) hv_store (hv_sig, strpair ("__WARN__"), SvREFCNT_inc (sv_warnhook), 0); 1516 if (!PL_warnhook) hv_store (hv_sig, "__WARN__", sizeof ("__WARN__") - 1, SvREFCNT_inc (sv_warnhook), 0);
1519 1517
1520 coro_state_stash = gv_stashpv ("Coro::State", TRUE); 1518 coro_state_stash = gv_stashpv ("Coro::State", TRUE);
1521 1519
1522 newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE)); 1520 newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE));
1523 newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB)); 1521 newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB));
1853 CODE: 1851 CODE:
1854{ 1852{
1855 struct coro *coro = SvSTATE (coro_current); 1853 struct coro *coro = SvSTATE (coro_current);
1856 HV *hv = (HV *)SvRV (coro_current); 1854 HV *hv = (HV *)SvRV (coro_current);
1857 AV *defav = GvAV (PL_defgv); 1855 AV *defav = GvAV (PL_defgv);
1858 SV *invoke = hv_delete (hv, strpair ("_invoke"), 0); 1856 SV *invoke = hv_delete (hv, "_invoke", sizeof ("_invoke") - 1, 0);
1859 AV *invoke_av; 1857 AV *invoke_av;
1860 int i, len; 1858 int i, len;
1861 1859
1862 if (!invoke) 1860 if (!invoke)
1863 croak ("\3async_pool terminate\2\n"); 1861 croak ("\3async_pool terminate\2\n");
1864 1862
1865 SvREFCNT_dec (coro->saved_deffh); 1863 SvREFCNT_dec (coro->saved_deffh);
1866 coro->saved_deffh = SvREFCNT_inc ((SV *)PL_defoutgv); 1864 coro->saved_deffh = SvREFCNT_inc ((SV *)PL_defoutgv);
1867 1865
1868 hv_store (hv, "desc", sizeof ("desc") - 1, 1866 hv_store (hv, "desc", sizeof ("desc") - 1,
1869 newSVpvn (strpair ("[async_pool]")), 0); 1867 newSVpvn ("[async_pool]", sizeof ("[async_pool]") - 1), 0);
1870 1868
1871 invoke_av = (AV *)SvRV (invoke); 1869 invoke_av = (AV *)SvRV (invoke);
1872 len = av_len (invoke_av); 1870 len = av_len (invoke_av);
1873 1871
1874 sv_setsv (cb, AvARRAY (invoke_av)[0]); 1872 sv_setsv (cb, AvARRAY (invoke_av)[0]);
1897 if (coro_rss (aTHX_ coro) > SvIV (sv_pool_rss) 1895 if (coro_rss (aTHX_ coro) > SvIV (sv_pool_rss)
1898 || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size)) 1896 || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size))
1899 croak ("\3async_pool terminate\2\n"); 1897 croak ("\3async_pool terminate\2\n");
1900 1898
1901 av_clear (GvAV (PL_defgv)); 1899 av_clear (GvAV (PL_defgv));
1902 hv_store ((HV *)SvRV (coro_current), strpair ("desc"), 1900 hv_store ((HV *)SvRV (coro_current), "desc", sizeof ("desc") - 1,
1903 newSVpvn (strpair ("[async_pool idle]")), 0); 1901 newSVpvn ("[async_pool idle]", sizeof ("[async_pool idle]") - 1), 0);
1904 1902
1905 coro->prio = 0; 1903 coro->prio = 0;
1906 1904
1907 if (coro->cctx && (coro->cctx->flags & CC_TRACE)) 1905 if (coro->cctx && (coro->cctx->flags & CC_TRACE))
1908 api_trace (coro_current, 0); 1906 api_trace (coro_current, 0);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines