… | |
… | |
289 | |
289 | |
290 | /* for Coro.pm */ |
290 | /* for Coro.pm */ |
291 | static SV *coro_current; |
291 | static SV *coro_current; |
292 | static SV *coro_readyhook; |
292 | static SV *coro_readyhook; |
293 | static AV *coro_ready [PRIO_MAX - PRIO_MIN + 1]; |
293 | static AV *coro_ready [PRIO_MAX - PRIO_MIN + 1]; |
|
|
294 | static CV *cv_coro_run; |
294 | static struct coro *coro_first; |
295 | static 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 | |
2617 | SV * |
2618 | SV * |
2618 | new (char *klass, ...) |
2619 | new (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)); |