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.308 by root, Wed Nov 19 15:09:57 2008 UTC vs.
Revision 1.310 by root, Wed Nov 19 16:01:32 2008 UTC

289 289
290/* for Coro.pm */ 290/* for Coro.pm */
291static SV *coro_current; 291static SV *coro_current;
292static SV *coro_readyhook; 292static SV *coro_readyhook;
293static AV *coro_ready [PRIO_MAX - PRIO_MIN + 1]; 293static AV *coro_ready [PRIO_MAX - PRIO_MIN + 1];
294static CV *cv_coro_run;
294static struct coro *coro_first; 295static struct coro *coro_first;
295#define coro_nready coroapi.nready 296#define coro_nready coroapi.nready
296 297
297/** lowlevel stuff **********************************************************/ 298/** lowlevel stuff **********************************************************/
298 299
2614 assert (("PRIO_NORMAL must be 0", !PRIO_NORMAL)); 2615 assert (("PRIO_NORMAL must be 0", !PRIO_NORMAL));
2615} 2616}
2616 2617
2617SV * 2618SV *
2618new (char *klass, ...) 2619new (char *klass, ...)
2620 ALIAS:
2621 Coro::new = 1
2619 CODE: 2622 CODE:
2620{ 2623{
2621 struct coro *coro; 2624 struct coro *coro;
2622 MAGIC *mg; 2625 MAGIC *mg;
2623 HV *hv; 2626 HV *hv;
2626 2629
2627 if (items > 1) 2630 if (items > 1)
2628 { 2631 {
2629 cb = coro_sv_2cv (ST (1)); 2632 cb = coro_sv_2cv (ST (1));
2630 2633
2634 if (!ix)
2635 {
2631 if (CvISXSUB (cb)) 2636 if (CvISXSUB (cb))
2632 croak ("Coro::State doesn't support XS functions as coroutine start, caught"); 2637 croak ("Coro::State doesn't support XS functions as coroutine start, caught");
2633 2638
2634 if (!CvROOT (cb)) 2639 if (!CvROOT (cb))
2635 croak ("Coro::State doesn't support autoloaded or undefined functions as coroutine start, caught"); 2640 croak ("Coro::State doesn't support autoloaded or undefined functions as coroutine start, caught");
2641 }
2636 } 2642 }
2637 2643
2638 Newz (0, coro, 1, struct coro); 2644 Newz (0, coro, 1, struct coro);
2639 coro->args = newAV (); 2645 coro->args = newAV ();
2640 coro->flags = CF_NEW; 2646 coro->flags = CF_NEW;
2648 mg->mg_flags |= MGf_DUP; 2654 mg->mg_flags |= MGf_DUP;
2649 RETVAL = sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1)); 2655 RETVAL = sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1));
2650 2656
2651 if (items > 1) 2657 if (items > 1)
2652 { 2658 {
2653 coro->startcv = SvREFCNT_inc_NN (cb);
2654
2655 av_extend (coro->args, items - 1); 2659 av_extend (coro->args, items - 1 + ix);
2660
2661 if (ix)
2662 {
2663 av_push (coro->args, SvREFCNT_inc_NN ((SV *)cb));
2664 cb = cv_coro_run;
2665 }
2666
2667 coro->startcv = (CV *)SvREFCNT_inc_NN ((SV *)cb);
2668
2656 for (i = 2; i < items; i++) 2669 for (i = 2; i < items; i++)
2657 av_push (coro->args, newSVsv (ST (i))); 2670 av_push (coro->args, newSVsv (ST (i)));
2658 } 2671 }
2659} 2672}
2660 OUTPUT: 2673 OUTPUT:
2864 int i; 2877 int i;
2865 2878
2866 av_async_pool = coro_get_av (aTHX_ "Coro::async_pool", TRUE); 2879 av_async_pool = coro_get_av (aTHX_ "Coro::async_pool", TRUE);
2867 sv_pool_rss = coro_get_sv (aTHX_ "Coro::POOL_RSS" , TRUE); 2880 sv_pool_rss = coro_get_sv (aTHX_ "Coro::POOL_RSS" , TRUE);
2868 sv_pool_size = coro_get_sv (aTHX_ "Coro::POOL_SIZE" , TRUE); 2881 sv_pool_size = coro_get_sv (aTHX_ "Coro::POOL_SIZE" , TRUE);
2869 2882 cv_coro_run = get_cv (aTHX_ "Coro::_terminate", GV_ADD);
2870 coro_current = coro_get_sv (aTHX_ "Coro::current", FALSE); 2883 coro_current = coro_get_sv (aTHX_ "Coro::current" , FALSE);
2871 SvREADONLY_on (coro_current); 2884 SvREADONLY_on (coro_current);
2872 2885
2873 coro_stash = gv_stashpv ("Coro", TRUE); 2886 coro_stash = gv_stashpv ("Coro", TRUE);
2874 2887
2875 newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (PRIO_MAX)); 2888 newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (PRIO_MAX));

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines