… | |
… | |
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 | |
|
|
1810 | void |
|
|
1811 | force_cctx () |
|
|
1812 | CODE: |
|
|
1813 | struct coro *coro = SvSTATE (coro_current); |
|
|
1814 | coro->cctx->idle_sp = 0; |
1805 | |
1815 | |
1806 | MODULE = Coro::State PACKAGE = Coro |
1816 | MODULE = Coro::State PACKAGE = Coro |
1807 | |
1817 | |
1808 | BOOT: |
1818 | BOOT: |
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 | |
|
|
1911 | void |
|
|
1912 | swap_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 |
1902 | void |
1928 | void |
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 | |