… | |
… | |
792 | if (!SvOBJECT (sv) || SvSTASH (sv) != coro_state_stash) \ |
792 | if (!SvOBJECT (sv) || SvSTASH (sv) != coro_state_stash) \ |
793 | croak ("%s() -- %s is not (and contains not) a Coro::State object", func, # sv); \ |
793 | croak ("%s() -- %s is not (and contains not) a Coro::State object", func, # sv); \ |
794 | \ |
794 | \ |
795 | } while(0) |
795 | } while(0) |
796 | |
796 | |
797 | #define SvSTATE(sv) INT2PTR (struct coro *, SvIV (sv)) |
797 | #define SvSTATE(sv) INT2PTR (struct coro *, SvIVX (sv)) |
798 | |
798 | |
799 | static void |
799 | static void |
800 | api_transfer(pTHX_ SV *prev, SV *next, int flags) |
800 | api_transfer(pTHX_ SV *prev, SV *next, int flags) |
801 | { |
801 | { |
802 | SV_CORO (prev, "Coro::transfer"); |
802 | SV_CORO (prev, "Coro::transfer"); |
… | |
… | |
814 | #define PRIO_IDLE -3 |
814 | #define PRIO_IDLE -3 |
815 | #define PRIO_MIN -4 |
815 | #define PRIO_MIN -4 |
816 | |
816 | |
817 | /* for Coro.pm */ |
817 | /* for Coro.pm */ |
818 | static GV *coro_current, *coro_idle; |
818 | static GV *coro_current, *coro_idle; |
819 | static AV *coro_ready[PRIO_MAX-PRIO_MIN+1]; |
819 | static AV *coro_ready [PRIO_MAX-PRIO_MIN+1]; |
820 | static int coro_nready; |
820 | static int coro_nready; |
821 | |
821 | |
822 | static void |
822 | static void |
823 | coro_enq (pTHX_ SV *sv) |
823 | coro_enq (pTHX_ SV *sv) |
824 | { |
824 | { |
… | |
… | |
847 | min_prio -= PRIO_MIN; |
847 | min_prio -= PRIO_MIN; |
848 | if (min_prio < 0) |
848 | if (min_prio < 0) |
849 | min_prio = 0; |
849 | min_prio = 0; |
850 | |
850 | |
851 | for (prio = PRIO_MAX - PRIO_MIN + 1; --prio >= min_prio; ) |
851 | for (prio = PRIO_MAX - PRIO_MIN + 1; --prio >= min_prio; ) |
852 | if (AvFILLp (coro_ready[prio]) >= 0) |
852 | if (AvFILLp (coro_ready [prio]) >= 0) |
853 | { |
853 | { |
854 | coro_nready--; |
854 | coro_nready--; |
855 | return av_shift (coro_ready[prio]); |
855 | return av_shift (coro_ready [prio]); |
856 | } |
856 | } |
857 | |
857 | |
858 | return 0; |
858 | return 0; |
859 | } |
859 | } |
860 | |
860 | |
… | |
… | |
1026 | av_fill (defav, items - 1); |
1026 | av_fill (defav, items - 1); |
1027 | while (items--) |
1027 | while (items--) |
1028 | av_store (defav, items, SvREFCNT_inc (ST(items))); |
1028 | av_store (defav, items, SvREFCNT_inc (ST(items))); |
1029 | |
1029 | |
1030 | sv = av_pop ((AV *)SvRV (yieldstack)); |
1030 | sv = av_pop ((AV *)SvRV (yieldstack)); |
1031 | prev = INT2PTR (struct coro *, SvIV ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 0, 0)))); |
1031 | prev = SvSTATE ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 0, 0))); |
1032 | next = INT2PTR (struct coro *, SvIV ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 1, 0)))); |
1032 | next = SvSTATE ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 1, 0))); |
1033 | SvREFCNT_dec (sv); |
1033 | SvREFCNT_dec (sv); |
1034 | |
1034 | |
1035 | transfer (aTHX_ prev, next, 0); |
1035 | transfer (aTHX_ prev, next, 0); |
1036 | |
1036 | |
1037 | MODULE = Coro::State PACKAGE = Coro |
1037 | MODULE = Coro::State PACKAGE = Coro |