--- Coro/Coro/State.xs 2006/11/20 22:26:16 1.82 +++ Coro/Coro/State.xs 2006/11/24 00:31:21 1.84 @@ -669,8 +669,9 @@ abort (); } +/* never call directly, always through the coro_state_transfer global variable */ static void -transfer (pTHX_ struct coro *prev, struct coro *next, int flags) +transfer_impl (pTHX_ struct coro *prev, struct coro *next, int flags) { dSTACKLEVEL; @@ -773,6 +774,8 @@ UNLOCK; } +void (*coro_state_transfer)(pTHX_ struct coro *prev, struct coro *next, int flags) = transfer_impl; + #define SV_CORO(sv,func) \ do { \ if (SvROK (sv)) \ @@ -794,15 +797,15 @@ \ } while(0) -#define SvSTATE(sv) INT2PTR (struct coro *, SvIV (sv)) +#define SvSTATE(sv) INT2PTR (struct coro *, SvIVX (sv)) static void -api_transfer(pTHX_ SV *prev, SV *next, int flags) +api_transfer (pTHX_ SV *prev, SV *next, int flags) { SV_CORO (prev, "Coro::transfer"); SV_CORO (next, "Coro::transfer"); - transfer (aTHX_ SvSTATE (prev), SvSTATE (next), flags); + coro_state_transfer (aTHX_ SvSTATE (prev), SvSTATE (next), flags); } /** Coro ********************************************************************/ @@ -816,7 +819,7 @@ /* for Coro.pm */ static GV *coro_current, *coro_idle; -static AV *coro_ready[PRIO_MAX-PRIO_MIN+1]; +static AV *coro_ready [PRIO_MAX-PRIO_MIN+1]; static int coro_nready; static void @@ -849,10 +852,10 @@ min_prio = 0; for (prio = PRIO_MAX - PRIO_MIN + 1; --prio >= min_prio; ) - if (AvFILLp (coro_ready[prio]) >= 0) + if (AvFILLp (coro_ready [prio]) >= 0) { coro_nready--; - return av_shift (coro_ready[prio]); + return av_shift (coro_ready [prio]); } return 0; @@ -896,8 +899,8 @@ UNLOCK; - transfer (aTHX_ SvSTATE (prev), SvSTATE (next), - TRANSFER_SAVE_ALL | TRANSFER_LAZY_STACK); + coro_state_transfer (aTHX_ SvSTATE (prev), SvSTATE (next), + TRANSFER_SAVE_ALL | TRANSFER_LAZY_STACK); } static void @@ -968,7 +971,7 @@ PUTBACK; SV_CORO (next, "Coro::transfer"); SV_CORO (prev, "Coro::transfer"); - transfer (aTHX_ SvSTATE (prev), SvSTATE (next), flags); + coro_state_transfer (aTHX_ SvSTATE (prev), SvSTATE (next), flags); SPAGAIN; void @@ -1028,11 +1031,11 @@ av_store (defav, items, SvREFCNT_inc (ST(items))); sv = av_pop ((AV *)SvRV (yieldstack)); - prev = INT2PTR (struct coro *, SvIV ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 0, 0)))); - next = INT2PTR (struct coro *, SvIV ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 1, 0)))); + prev = SvSTATE ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 0, 0))); + next = SvSTATE ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 1, 0))); SvREFCNT_dec (sv); - transfer (aTHX_ prev, next, 0); + coro_state_transfer (aTHX_ prev, next, 0); MODULE = Coro::State PACKAGE = Coro