… | |
… | |
449 | else |
449 | else |
450 | { |
450 | { |
451 | #if CORO_PREFER_PERL_FUNCTIONS |
451 | #if CORO_PREFER_PERL_FUNCTIONS |
452 | /* this is probably cleaner? but also slower! */ |
452 | /* this is probably cleaner? but also slower! */ |
453 | /* in practise, it seems to be less stable */ |
453 | /* in practise, it seems to be less stable */ |
454 | CV *cp = Perl_cv_clone (cv); |
454 | CV *cp = Perl_cv_clone (aTHX_ cv); |
455 | CvPADLIST (cv) = CvPADLIST (cp); |
455 | CvPADLIST (cv) = CvPADLIST (cp); |
456 | CvPADLIST (cp) = 0; |
456 | CvPADLIST (cp) = 0; |
457 | SvREFCNT_dec (cp); |
457 | SvREFCNT_dec (cp); |
458 | #else |
458 | #else |
459 | CvPADLIST (cv) = coro_clone_padlist (aTHX_ cv); |
459 | CvPADLIST (cv) = coro_clone_padlist (aTHX_ cv); |
… | |
… | |
603 | * of perl.c:init_stacks, except that it uses less memory |
603 | * of perl.c:init_stacks, except that it uses less memory |
604 | * on the (sometimes correct) assumption that coroutines do |
604 | * on the (sometimes correct) assumption that coroutines do |
605 | * not usually need a lot of stackspace. |
605 | * not usually need a lot of stackspace. |
606 | */ |
606 | */ |
607 | #if CORO_PREFER_PERL_FUNCTIONS |
607 | #if CORO_PREFER_PERL_FUNCTIONS |
608 | # define coro_init_stacks init_stacks |
608 | # define coro_init_stacks(thx) init_stacks () |
609 | #else |
609 | #else |
610 | static void |
610 | static void |
611 | coro_init_stacks (pTHX) |
611 | coro_init_stacks (pTHX) |
612 | { |
612 | { |
613 | PL_curstackinfo = new_stackinfo(32, 8); |
613 | PL_curstackinfo = new_stackinfo(32, 8); |
… | |
… | |
1752 | |
1752 | |
1753 | SvRV_set (data, (SV *)av); |
1753 | SvRV_set (data, (SV *)av); |
1754 | api_ready (aTHX_ coro); |
1754 | api_ready (aTHX_ coro); |
1755 | SvREFCNT_dec (coro); |
1755 | SvREFCNT_dec (coro); |
1756 | |
1756 | |
|
|
1757 | /* better take a full copy of the arguments */ |
1757 | while (items--) |
1758 | while (items--) |
1758 | av_store (av, items, SvREFCNT_inc_NN (ST (items))); |
1759 | av_store (av, items, newSVsv (ST (items))); |
1759 | } |
1760 | } |
1760 | |
1761 | |
1761 | XSRETURN_EMPTY; |
1762 | XSRETURN_EMPTY; |
1762 | } |
1763 | } |
1763 | |
1764 | |
… | |
… | |
1778 | AV *av = (AV *)SvRV (data); |
1779 | AV *av = (AV *)SvRV (data); |
1779 | int i; |
1780 | int i; |
1780 | |
1781 | |
1781 | EXTEND (SP, AvFILLp (av) + 1); |
1782 | EXTEND (SP, AvFILLp (av) + 1); |
1782 | for (i = 0; i <= AvFILLp (av); ++i) |
1783 | for (i = 0; i <= AvFILLp (av); ++i) |
1783 | PUSHs (AvARRAY (av)[i]); |
1784 | PUSHs (sv_2mortal (AvARRAY (av)[i])); |
|
|
1785 | |
|
|
1786 | /* we have stolen the elements, so ste length to zero and free */ |
|
|
1787 | AvFILLp (av) = -1; |
|
|
1788 | av_undef (av); |
1784 | |
1789 | |
1785 | PUTBACK; |
1790 | PUTBACK; |
1786 | } |
1791 | } |
1787 | |
1792 | |
1788 | return 0; |
1793 | return 0; |
… | |
… | |
1828 | struct coro *coro = SvSTATE_hv (hv); |
1833 | struct coro *coro = SvSTATE_hv (hv); |
1829 | SV *data = newRV_inc ((SV *)hv); |
1834 | SV *data = newRV_inc ((SV *)hv); |
1830 | SV *cb = gensub (aTHX_ coro_rouse_callback, (void *)data); |
1835 | SV *cb = gensub (aTHX_ coro_rouse_callback, (void *)data); |
1831 | |
1836 | |
1832 | sv_magicext (SvRV (cb), data, CORO_MAGIC_type_rouse, 0, 0, 0); |
1837 | sv_magicext (SvRV (cb), data, CORO_MAGIC_type_rouse, 0, 0, 0); |
|
|
1838 | SvREFCNT_dec (data); /* magicext increases the refcount */ |
1833 | |
1839 | |
1834 | SvREFCNT_dec (coro->rouse_cb); |
1840 | SvREFCNT_dec (coro->rouse_cb); |
1835 | coro->rouse_cb = SvREFCNT_inc_NN (cb); |
1841 | coro->rouse_cb = SvREFCNT_inc_NN (cb); |
1836 | |
1842 | |
1837 | return cb; |
1843 | return cb; |
… | |
… | |
2137 | SV **ary; |
2143 | SV **ary; |
2138 | |
2144 | |
2139 | /* unfortunately, building manually saves memory */ |
2145 | /* unfortunately, building manually saves memory */ |
2140 | Newx (ary, 2, SV *); |
2146 | Newx (ary, 2, SV *); |
2141 | AvALLOC (av) = ary; |
2147 | AvALLOC (av) = ary; |
2142 | AvARRAY (av) = ary; |
2148 | /*AvARRAY (av) = ary;*/ |
|
|
2149 | SvPVX ((SV *)av) = (char *)ary; /* 5.8.8 needs this syntax instead of AvARRAY = ary */ |
2143 | AvMAX (av) = 1; |
2150 | AvMAX (av) = 1; |
2144 | AvFILLp (av) = 0; |
2151 | AvFILLp (av) = 0; |
2145 | ary [0] = newSViv (count); |
2152 | ary [0] = newSViv (count); |
2146 | |
2153 | |
2147 | return newRV_noinc ((SV *)av); |
2154 | return newRV_noinc ((SV *)av); |
… | |
… | |
2167 | AvARRAY (av)[0] = AvARRAY (av)[1]; |
2174 | AvARRAY (av)[0] = AvARRAY (av)[1]; |
2168 | AvARRAY (av)[1] = count_sv; |
2175 | AvARRAY (av)[1] = count_sv; |
2169 | cb = av_shift (av); |
2176 | cb = av_shift (av); |
2170 | |
2177 | |
2171 | if (SvOBJECT (cb)) |
2178 | if (SvOBJECT (cb)) |
|
|
2179 | { |
2172 | api_ready (aTHX_ cb); |
2180 | api_ready (aTHX_ cb); |
2173 | else |
2181 | --count; |
2174 | croak ("callbacks not yet supported"); |
2182 | } |
|
|
2183 | else if (SvTYPE (cb) == SVt_PVCV) |
|
|
2184 | { |
|
|
2185 | dSP; |
|
|
2186 | PUSHMARK (SP); |
|
|
2187 | XPUSHs (sv_2mortal (newRV_inc ((SV *)av))); |
|
|
2188 | PUTBACK; |
|
|
2189 | call_sv (cb, G_VOID | G_DISCARD | G_EVAL | G_KEEPERR); |
|
|
2190 | } |
2175 | |
2191 | |
2176 | SvREFCNT_dec (cb); |
2192 | SvREFCNT_dec (cb); |
2177 | |
|
|
2178 | --count; |
|
|
2179 | } |
2193 | } |
2180 | } |
2194 | } |
2181 | |
2195 | |
2182 | static void |
2196 | static void |
2183 | coro_semaphore_on_destroy (pTHX_ struct coro *coro) |
2197 | coro_semaphore_on_destroy (pTHX_ struct coro *coro) |
… | |
… | |
2265 | } |
2279 | } |
2266 | |
2280 | |
2267 | static void |
2281 | static void |
2268 | slf_init_semaphore_wait (pTHX_ struct CoroSLF *frame, CV *cv, SV **arg, int items) |
2282 | slf_init_semaphore_wait (pTHX_ struct CoroSLF *frame, CV *cv, SV **arg, int items) |
2269 | { |
2283 | { |
|
|
2284 | if (items >= 2) |
|
|
2285 | { |
|
|
2286 | /* callback form */ |
|
|
2287 | AV *av = (AV *)SvRV (arg [0]); |
|
|
2288 | HV *st; |
|
|
2289 | GV *gvp; |
|
|
2290 | CV *cb_cv = sv_2cv (arg [1], &st, &gvp, 0); |
|
|
2291 | |
|
|
2292 | av_push (av, (SV *)SvREFCNT_inc_NN (cb_cv)); |
|
|
2293 | |
|
|
2294 | if (SvIVX (AvARRAY (av)[0]) > 0) |
|
|
2295 | coro_semaphore_adjust (aTHX_ av, 0); |
|
|
2296 | |
|
|
2297 | frame->prepare = prepare_nop; |
|
|
2298 | frame->check = slf_check_nop; |
|
|
2299 | } |
|
|
2300 | else |
|
|
2301 | { |
2270 | slf_init_semaphore_down_or_wait (aTHX_ frame, cv, arg, items); |
2302 | slf_init_semaphore_down_or_wait (aTHX_ frame, cv, arg, items); |
2271 | frame->check = slf_check_semaphore_wait; |
2303 | frame->check = slf_check_semaphore_wait; |
|
|
2304 | } |
2272 | } |
2305 | } |
2273 | |
2306 | |
2274 | /* signal */ |
2307 | /* signal */ |
2275 | |
2308 | |
2276 | static void |
2309 | static void |
… | |
… | |
2983 | RETVAL = coro_new_rouse_cb (aTHX); |
3016 | RETVAL = coro_new_rouse_cb (aTHX); |
2984 | OUTPUT: |
3017 | OUTPUT: |
2985 | RETVAL |
3018 | RETVAL |
2986 | |
3019 | |
2987 | void |
3020 | void |
2988 | rouse_wait (SV *cb = 0) |
3021 | rouse_wait (...) |
2989 | PROTOTYPE: ;$ |
3022 | PROTOTYPE: ;$ |
2990 | PPCODE: |
3023 | PPCODE: |
2991 | CORO_EXECUTE_SLF_XS (slf_init_rouse_wait); |
3024 | CORO_EXECUTE_SLF_XS (slf_init_rouse_wait); |
2992 | |
3025 | |
2993 | |
3026 | |
… | |
… | |
3030 | adjust = 1 |
3063 | adjust = 1 |
3031 | CODE: |
3064 | CODE: |
3032 | coro_semaphore_adjust (aTHX_ (AV *)SvRV (self), ix ? adjust : 1); |
3065 | coro_semaphore_adjust (aTHX_ (AV *)SvRV (self), ix ? adjust : 1); |
3033 | |
3066 | |
3034 | void |
3067 | void |
3035 | down (SV *self) |
3068 | down (...) |
3036 | CODE: |
3069 | CODE: |
3037 | CORO_EXECUTE_SLF_XS (slf_init_semaphore_down); |
3070 | CORO_EXECUTE_SLF_XS (slf_init_semaphore_down); |
3038 | |
3071 | |
3039 | void |
3072 | void |
3040 | wait (SV *self) |
3073 | wait (...) |
3041 | CODE: |
3074 | CODE: |
3042 | CORO_EXECUTE_SLF_XS (slf_init_semaphore_wait); |
3075 | CORO_EXECUTE_SLF_XS (slf_init_semaphore_wait); |
3043 | |
3076 | |
3044 | void |
3077 | void |
3045 | try (SV *self) |
3078 | try (SV *self) |
… | |
… | |
3088 | ); |
3121 | ); |
3089 | OUTPUT: |
3122 | OUTPUT: |
3090 | RETVAL |
3123 | RETVAL |
3091 | |
3124 | |
3092 | void |
3125 | void |
3093 | wait (SV *self) |
3126 | wait (...) |
3094 | CODE: |
3127 | CODE: |
3095 | CORO_EXECUTE_SLF_XS (slf_init_signal_wait); |
3128 | CORO_EXECUTE_SLF_XS (slf_init_signal_wait); |
3096 | |
3129 | |
3097 | void |
3130 | void |
3098 | broadcast (SV *self) |
3131 | broadcast (SV *self) |