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.302 by root, Wed Nov 19 04:48:24 2008 UTC vs.
Revision 1.306 by root, Wed Nov 19 11:11:10 2008 UTC

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
610static void 610static void
611coro_init_stacks (pTHX) 611coro_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
2182static void 2196static void
2183coro_semaphore_on_destroy (pTHX_ struct coro *coro) 2197coro_semaphore_on_destroy (pTHX_ struct coro *coro)
2265} 2279}
2266 2280
2267static void 2281static void
2268slf_init_semaphore_wait (pTHX_ struct CoroSLF *frame, CV *cv, SV **arg, int items) 2282slf_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
2276static void 2309static 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
2987void 3020void
2988rouse_wait (SV *cb = 0) 3021rouse_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
3034void 3067void
3035down (SV *self) 3068down (...)
3036 CODE: 3069 CODE:
3037 CORO_EXECUTE_SLF_XS (slf_init_semaphore_down); 3070 CORO_EXECUTE_SLF_XS (slf_init_semaphore_down);
3038 3071
3039void 3072void
3040wait (SV *self) 3073wait (...)
3041 CODE: 3074 CODE:
3042 CORO_EXECUTE_SLF_XS (slf_init_semaphore_wait); 3075 CORO_EXECUTE_SLF_XS (slf_init_semaphore_wait);
3043 3076
3044void 3077void
3045try (SV *self) 3078try (SV *self)
3088 ); 3121 );
3089 OUTPUT: 3122 OUTPUT:
3090 RETVAL 3123 RETVAL
3091 3124
3092void 3125void
3093wait (SV *self) 3126wait (...)
3094 CODE: 3127 CODE:
3095 CORO_EXECUTE_SLF_XS (slf_init_signal_wait); 3128 CORO_EXECUTE_SLF_XS (slf_init_signal_wait);
3096 3129
3097void 3130void
3098broadcast (SV *self) 3131broadcast (SV *self)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines