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.298 by root, Tue Nov 18 23:20:41 2008 UTC vs.
Revision 1.299 by root, Wed Nov 19 00:06:55 2008 UTC

1997}; 1997};
1998 1998
1999/*****************************************************************************/ 1999/*****************************************************************************/
2000/* Coro::Semaphore */ 2000/* Coro::Semaphore */
2001 2001
2002static SV *
2003coro_semaphore_new (int count)
2004{
2005 /* a semaphore contains a counter IV in $sem->[0] and any waiters after that */
2006 AV *av = newAV ();
2007 SV **ary;
2008
2009 /* unfortunately, building manually saves memory */
2010 Newx (ary, 2, SV *);
2011 AvALLOC (av) = ary;
2012 AvARRAY (av) = ary;
2013 AvMAX (av) = 1;
2014 AvFILLp (av) = 0;
2015 ary [0] = newSViv (count);
2016
2017 return newRV_noinc ((SV *)av);
2018}
2019
2002static void 2020static void
2003coro_semaphore_adjust (pTHX_ AV *av, IV adjust) 2021coro_semaphore_adjust (pTHX_ AV *av, IV adjust)
2004{ 2022{
2005 SV *count_sv = AvARRAY (av)[0]; 2023 SV *count_sv = AvARRAY (av)[0];
2006 IV count = SvIVX (count_sv); 2024 IV count = SvIVX (count_sv);
2800 2818
2801 2819
2802MODULE = Coro::State PACKAGE = Coro::Semaphore 2820MODULE = Coro::State PACKAGE = Coro::Semaphore
2803 2821
2804SV * 2822SV *
2805new (SV *klass, SV *count_ = 0) 2823new (SV *klass, SV *count = 0)
2806 CODE: 2824 CODE:
2807{ 2825 RETVAL = sv_bless (
2808 /* a semaphore contains a counter IV in $sem->[0] and any waiters after that */ 2826 coro_semaphore_new (count && SvOK (count) ? SvIV (count) : 1),
2809 AV *av = newAV (); 2827 GvSTASH (CvGV (cv))
2810 SV **ary; 2828 );
2829 OUTPUT:
2830 RETVAL
2811 2831
2812 /* unfortunately, building manually saves memory */ 2832# helper for Coro::Channel
2813 Newx (ary, 2, SV *); 2833SV *
2814 AvALLOC (av) = ary; 2834_alloc (int count)
2815 AvARRAY (av) = ary; 2835 CODE:
2816 AvMAX (av) = 1; 2836 RETVAL = coro_semaphore_new (count);
2817 AvFILLp (av) = 0;
2818 ary [0] = newSViv (count_ && SvOK (count_) ? SvIV (count_) : 1);
2819
2820 RETVAL = sv_bless (newRV_noinc ((SV *)av), GvSTASH (CvGV (cv)));
2821}
2822 OUTPUT: 2837 OUTPUT:
2823 RETVAL 2838 RETVAL
2824 2839
2825SV * 2840SV *
2826count (SV *self) 2841count (SV *self)
2836 CODE: 2851 CODE:
2837 coro_semaphore_adjust (aTHX_ (AV *)SvRV (self), ix ? adjust : 1); 2852 coro_semaphore_adjust (aTHX_ (AV *)SvRV (self), ix ? adjust : 1);
2838 2853
2839void 2854void
2840down (SV *self) 2855down (SV *self)
2856 ALIAS:
2857 Coro::Signal::wait = 0
2841 CODE: 2858 CODE:
2842 CORO_EXECUTE_SLF_XS (slf_init_semaphore_down); 2859 CORO_EXECUTE_SLF_XS (slf_init_semaphore_down);
2843 2860
2844void 2861void
2845wait (SV *self) 2862wait (SV *self)
2864 XSRETURN_NO; 2881 XSRETURN_NO;
2865} 2882}
2866 2883
2867void 2884void
2868waiters (SV *self) 2885waiters (SV *self)
2869 CODE: 2886 PPCODE:
2870{ 2887{
2871 AV *av = (AV *)SvRV (self); 2888 AV *av = (AV *)SvRV (self);
2889 int wcount = AvFILLp (av) + 1 - 1;
2872 2890
2873 if (GIMME_V == G_SCALAR) 2891 if (GIMME_V == G_SCALAR)
2874 XPUSHs (sv_2mortal (newSVsv (AvARRAY (av)[0]))); 2892 XPUSHs (sv_2mortal (newSViv (wcount)));
2875 else 2893 else
2876 { 2894 {
2877 int i; 2895 int i;
2878 EXTEND (SP, AvFILLp (av) + 1 - 1); 2896 EXTEND (SP, wcount);
2879 for (i = 1; i <= AvFILLp (av); ++i) 2897 for (i = 1; i <= wcount; ++i)
2880 PUSHs (sv_2mortal (newRV_inc (AvARRAY (av)[i]))); 2898 PUSHs (sv_2mortal (newRV_inc (AvARRAY (av)[i])));
2881 } 2899 }
2900}
2901
2902MODULE = Coro::State PACKAGE = Coro::Signal
2903
2904SV *
2905new (SV *klass)
2906 CODE:
2907 RETVAL = sv_bless (
2908 coro_semaphore_new (0),
2909 GvSTASH (CvGV (cv))
2910 );
2911 OUTPUT:
2912 RETVAL
2913
2914void
2915broadcast (SV *self, int adjust = 1)
2916 CODE:
2917{
2918 AV *av = (AV *)SvRV (self);
2919 SvIVX (AvARRAY (av)[0]) = 0; /* not necessary, but gives me fuzzy warm feelings */
2920 coro_semaphore_adjust (aTHX_ av, AvFILLp (av) + 1 - 1);
2921 SvIVX (AvARRAY (av)[0]) = 0; /* necessary */
2882} 2922}
2883 2923
2884 2924
2885MODULE = Coro::State PACKAGE = Coro::AnyEvent 2925MODULE = Coro::State PACKAGE = Coro::AnyEvent
2886 2926

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines