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.83 by root, Mon Nov 20 22:32:44 2006 UTC vs.
Revision 1.84 by root, Fri Nov 24 00:31:21 2006 UTC

667 CALLRUNOPS(aTHX); 667 CALLRUNOPS(aTHX);
668 668
669 abort (); 669 abort ();
670} 670}
671 671
672/* never call directly, always through the coro_state_transfer global variable */
672static void 673static void
673transfer (pTHX_ struct coro *prev, struct coro *next, int flags) 674transfer_impl (pTHX_ struct coro *prev, struct coro *next, int flags)
674{ 675{
675 dSTACKLEVEL; 676 dSTACKLEVEL;
676 677
677 if (prev != next) 678 if (prev != next)
678 { 679 {
771 coro_mortal = 0; 772 coro_mortal = 0;
772 } 773 }
773 UNLOCK; 774 UNLOCK;
774} 775}
775 776
777void (*coro_state_transfer)(pTHX_ struct coro *prev, struct coro *next, int flags) = transfer_impl;
778
776#define SV_CORO(sv,func) \ 779#define SV_CORO(sv,func) \
777 do { \ 780 do { \
778 if (SvROK (sv)) \ 781 if (SvROK (sv)) \
779 sv = SvRV (sv); \ 782 sv = SvRV (sv); \
780 \ 783 \
795 } while(0) 798 } while(0)
796 799
797#define SvSTATE(sv) INT2PTR (struct coro *, SvIVX (sv)) 800#define SvSTATE(sv) INT2PTR (struct coro *, SvIVX (sv))
798 801
799static void 802static void
800api_transfer(pTHX_ SV *prev, SV *next, int flags) 803api_transfer (pTHX_ SV *prev, SV *next, int flags)
801{ 804{
802 SV_CORO (prev, "Coro::transfer"); 805 SV_CORO (prev, "Coro::transfer");
803 SV_CORO (next, "Coro::transfer"); 806 SV_CORO (next, "Coro::transfer");
804 807
805 transfer (aTHX_ SvSTATE (prev), SvSTATE (next), flags); 808 coro_state_transfer (aTHX_ SvSTATE (prev), SvSTATE (next), flags);
806} 809}
807 810
808/** Coro ********************************************************************/ 811/** Coro ********************************************************************/
809 812
810#define PRIO_MAX 3 813#define PRIO_MAX 3
894 897
895 SV_CORO (next, "Coro::schedule"); 898 SV_CORO (next, "Coro::schedule");
896 899
897 UNLOCK; 900 UNLOCK;
898 901
899 transfer (aTHX_ SvSTATE (prev), SvSTATE (next), 902 coro_state_transfer (aTHX_ SvSTATE (prev), SvSTATE (next),
900 TRANSFER_SAVE_ALL | TRANSFER_LAZY_STACK); 903 TRANSFER_SAVE_ALL | TRANSFER_LAZY_STACK);
901} 904}
902 905
903static void 906static void
904api_cede (void) 907api_cede (void)
905{ 908{
966 PROTOTYPE: @ 969 PROTOTYPE: @
967 CODE: 970 CODE:
968 PUTBACK; 971 PUTBACK;
969 SV_CORO (next, "Coro::transfer"); 972 SV_CORO (next, "Coro::transfer");
970 SV_CORO (prev, "Coro::transfer"); 973 SV_CORO (prev, "Coro::transfer");
971 transfer (aTHX_ SvSTATE (prev), SvSTATE (next), flags); 974 coro_state_transfer (aTHX_ SvSTATE (prev), SvSTATE (next), flags);
972 SPAGAIN; 975 SPAGAIN;
973 976
974void 977void
975DESTROY(coro) 978DESTROY(coro)
976 Coro::State coro 979 Coro::State coro
1030 sv = av_pop ((AV *)SvRV (yieldstack)); 1033 sv = av_pop ((AV *)SvRV (yieldstack));
1031 prev = SvSTATE ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 0, 0))); 1034 prev = SvSTATE ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 0, 0)));
1032 next = SvSTATE ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 1, 0))); 1035 next = SvSTATE ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 1, 0)));
1033 SvREFCNT_dec (sv); 1036 SvREFCNT_dec (sv);
1034 1037
1035 transfer (aTHX_ prev, next, 0); 1038 coro_state_transfer (aTHX_ prev, next, 0);
1036 1039
1037MODULE = Coro::State PACKAGE = Coro 1040MODULE = Coro::State PACKAGE = Coro
1038 1041
1039BOOT: 1042BOOT:
1040{ 1043{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines