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.220 by root, Thu Jan 10 05:43:14 2008 UTC vs.
Revision 1.226 by root, Fri Apr 4 20:07:35 2008 UTC

72# ifndef IS_PADCONST 72# ifndef IS_PADCONST
73# define IS_PADCONST(v) 0 73# define IS_PADCONST(v) 0
74# endif 74# endif
75#endif 75#endif
76 76
77/* 5.8.8 */
78#ifndef GV_NOTQUAL
79# define GV_NOTQUAL 0
80#endif
81#ifndef newSV
82# define newSV(l) NEWSV(0,l)
83#endif
84
85/* 5.11 */
86#ifndef CxHASARGS
87# define CxHASARGS(cx) (cx)->blk_sub.hasargs
88#endif
89
77/* 5.8.7 */ 90/* 5.8.7 */
78#ifndef SvRV_set 91#ifndef SvRV_set
79# define SvRV_set(s,v) SvRV(s) = (v) 92# define SvRV_set(s,v) SvRV(s) = (v)
80#endif
81
82/* 5.8.8 */
83#ifndef GV_NOTQUAL
84# define GV_NOTQUAL 0
85#endif
86#ifndef newSV
87# define newSV(l) NEWSV(0,l)
88#endif 93#endif
89 94
90#if !__i386 && !__x86_64 && !__powerpc && !__m68k && !__alpha && !__mips && !__sparc64 95#if !__i386 && !__x86_64 && !__powerpc && !__m68k && !__alpha && !__mips && !__sparc64
91# undef CORO_STACKGUARD 96# undef CORO_STACKGUARD
92#endif 97#endif
895 SAVETMPS; 900 SAVETMPS;
896 EXTEND (SP, 3); 901 EXTEND (SP, 3);
897 PUSHMARK (SP); 902 PUSHMARK (SP);
898 PUSHs (&PL_sv_yes); 903 PUSHs (&PL_sv_yes);
899 PUSHs (fullname); 904 PUSHs (fullname);
900 PUSHs (cx->blk_sub.hasargs ? sv_2mortal (newRV_inc ((SV *)cx->blk_sub.argarray)) : &PL_sv_undef); 905 PUSHs (CxHASARGS (cx) ? sv_2mortal (newRV_inc ((SV *)cx->blk_sub.argarray)) : &PL_sv_undef);
901 PUTBACK; 906 PUTBACK;
902 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0); 907 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0);
903 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); 908 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD);
904 SPAGAIN; 909 SPAGAIN;
905 FREETMPS; 910 FREETMPS;
1123 if (expect_false (next->flags & CF_DESTROYED)) 1128 if (expect_false (next->flags & CF_DESTROYED))
1124 croak ("Coro::State::transfer called with destroyed next Coro::State, but can only transfer to inactive states"); 1129 croak ("Coro::State::transfer called with destroyed next Coro::State, but can only transfer to inactive states");
1125 1130
1126 if ( 1131 if (
1127#if PERL_VERSION_ATLEAST (5,9,0) 1132#if PERL_VERSION_ATLEAST (5,9,0)
1128 expect_false (PL_parser) 1133 expect_false (PL_parser && PL_parser->lex_state != LEX_NOTPARSING)
1129#else 1134#else
1130 expect_false (PL_lex_state != LEX_NOTPARSING) 1135 expect_false (PL_lex_state != LEX_NOTPARSING)
1131#endif 1136#endif
1132 ) 1137 )
1133 croak ("Coro::State::transfer called while parsing, but this is not supported"); 1138 croak ("Coro::State::transfer called while parsing, but this is not supported");
1800 case 1: RETVAL = coro->usecount; break; 1805 case 1: RETVAL = coro->usecount; break;
1801 } 1806 }
1802 OUTPUT: 1807 OUTPUT:
1803 RETVAL 1808 RETVAL
1804 1809
1810void
1811force_cctx ()
1812 CODE:
1813 struct coro *coro = SvSTATE (coro_current);
1814 coro->cctx->idle_sp = 0;
1805 1815
1806MODULE = Coro::State PACKAGE = Coro 1816MODULE = Coro::State PACKAGE = Coro
1807 1817
1808BOOT: 1818BOOT:
1809{ 1819{
1896 PROTOTYPE: $;$ 1906 PROTOTYPE: $;$
1897 CODE: 1907 CODE:
1898 SvREFCNT_dec (self->throw); 1908 SvREFCNT_dec (self->throw);
1899 self->throw = SvOK (throw) ? newSVsv (throw) : 0; 1909 self->throw = SvOK (throw) ? newSVsv (throw) : 0;
1900 1910
1911void
1912swap_defsv (Coro::State self)
1913 PROTOTYPE: $
1914 ALIAS:
1915 swap_defav = 1
1916 CODE:
1917 if (!self->slot)
1918 croak ("cannot swap state with coroutine that has no saved state");
1919 else
1920 {
1921 SV **src = ix ? (SV **)&GvAV (PL_defgv) : &GvSV (PL_defgv);
1922 SV **dst = ix ? (SV **)&self->slot->defav : (SV **)&self->slot->defsv;
1923
1924 SV *tmp = *src; *src = *dst; *dst = tmp;
1925 }
1926
1901# for async_pool speedup 1927# for async_pool speedup
1902void 1928void
1903_pool_1 (SV *cb) 1929_pool_1 (SV *cb)
1904 CODE: 1930 CODE:
1905{ 1931{
1909 SV *invoke = hv_delete (hv, "_invoke", sizeof ("_invoke") - 1, 0); 1935 SV *invoke = hv_delete (hv, "_invoke", sizeof ("_invoke") - 1, 0);
1910 AV *invoke_av; 1936 AV *invoke_av;
1911 int i, len; 1937 int i, len;
1912 1938
1913 if (!invoke) 1939 if (!invoke)
1940 {
1941 SvREFCNT_dec (PL_diehook); PL_diehook = 0;
1914 croak ("\3async_pool terminate\2\n"); 1942 croak ("\3async_pool terminate\2\n");
1943 }
1915 1944
1916 SvREFCNT_dec (coro->saved_deffh); 1945 SvREFCNT_dec (coro->saved_deffh);
1917 coro->saved_deffh = SvREFCNT_inc ((SV *)PL_defoutgv); 1946 coro->saved_deffh = SvREFCNT_inc ((SV *)PL_defoutgv);
1918 1947
1919 hv_store (hv, "desc", sizeof ("desc") - 1, 1948 hv_store (hv, "desc", sizeof ("desc") - 1,
1945 SvREFCNT_dec ((SV *)PL_defoutgv); PL_defoutgv = (GV *)coro->saved_deffh; 1974 SvREFCNT_dec ((SV *)PL_defoutgv); PL_defoutgv = (GV *)coro->saved_deffh;
1946 coro->saved_deffh = 0; 1975 coro->saved_deffh = 0;
1947 1976
1948 if (coro_rss (aTHX_ coro) > SvIV (sv_pool_rss) 1977 if (coro_rss (aTHX_ coro) > SvIV (sv_pool_rss)
1949 || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size)) 1978 || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size))
1979 {
1980 SvREFCNT_dec (PL_diehook); PL_diehook = 0;
1950 croak ("\3async_pool terminate\2\n"); 1981 croak ("\3async_pool terminate\2\n");
1982 }
1951 1983
1952 av_clear (GvAV (PL_defgv)); 1984 av_clear (GvAV (PL_defgv));
1953 hv_store ((HV *)SvRV (coro_current), "desc", sizeof ("desc") - 1, 1985 hv_store ((HV *)SvRV (coro_current), "desc", sizeof ("desc") - 1,
1954 newSVpvn ("[async_pool idle]", sizeof ("[async_pool idle]") - 1), 0); 1986 newSVpvn ("[async_pool idle]", sizeof ("[async_pool idle]") - 1), 0);
1955 1987

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines