… | |
… | |
2174 | AvARRAY (av)[0] = AvARRAY (av)[1]; |
2174 | AvARRAY (av)[0] = AvARRAY (av)[1]; |
2175 | AvARRAY (av)[1] = count_sv; |
2175 | AvARRAY (av)[1] = count_sv; |
2176 | cb = av_shift (av); |
2176 | cb = av_shift (av); |
2177 | |
2177 | |
2178 | if (SvOBJECT (cb)) |
2178 | if (SvOBJECT (cb)) |
|
|
2179 | { |
2179 | api_ready (aTHX_ cb); |
2180 | api_ready (aTHX_ cb); |
2180 | else |
2181 | --count; |
2181 | croak ("callbacks not yet supported"); |
2182 | } |
|
|
2183 | else if (SvTYPE (cb) == SVt_PVCV) |
|
|
2184 | { |
|
|
2185 | dSP; |
|
|
2186 | PUSHMARK (SP); |
|
|
2187 | XPUSHs (sv_2mortal (newRV_inc ((SV *)av))); |
|
|
2188 | PUTBACK; |
|
|
2189 | call_sv (cb, G_VOID | G_DISCARD | G_EVAL | G_KEEPERR); |
|
|
2190 | } |
2182 | |
2191 | |
2183 | SvREFCNT_dec (cb); |
2192 | SvREFCNT_dec (cb); |
2184 | |
|
|
2185 | --count; |
|
|
2186 | } |
2193 | } |
2187 | } |
2194 | } |
2188 | |
2195 | |
2189 | static void |
2196 | static void |
2190 | coro_semaphore_on_destroy (pTHX_ struct coro *coro) |
2197 | coro_semaphore_on_destroy (pTHX_ struct coro *coro) |
… | |
… | |
2272 | } |
2279 | } |
2273 | |
2280 | |
2274 | static void |
2281 | static void |
2275 | slf_init_semaphore_wait (pTHX_ struct CoroSLF *frame, CV *cv, SV **arg, int items) |
2282 | slf_init_semaphore_wait (pTHX_ struct CoroSLF *frame, CV *cv, SV **arg, int items) |
2276 | { |
2283 | { |
|
|
2284 | if (items >= 2) |
|
|
2285 | { |
|
|
2286 | /* callback form */ |
|
|
2287 | AV *av = (AV *)SvRV (arg [0]); |
|
|
2288 | HV *st; |
|
|
2289 | GV *gvp; |
|
|
2290 | CV *cb_cv = sv_2cv (arg [1], &st, &gvp, 0); |
|
|
2291 | |
|
|
2292 | av_push (av, (SV *)SvREFCNT_inc_NN (cb_cv)); |
|
|
2293 | |
|
|
2294 | if (SvIVX (AvARRAY (av)[0]) > 0) |
|
|
2295 | coro_semaphore_adjust (aTHX_ av, 0); |
|
|
2296 | |
|
|
2297 | frame->prepare = prepare_nop; |
|
|
2298 | frame->check = slf_check_nop; |
|
|
2299 | } |
|
|
2300 | else |
|
|
2301 | { |
2277 | slf_init_semaphore_down_or_wait (aTHX_ frame, cv, arg, items); |
2302 | slf_init_semaphore_down_or_wait (aTHX_ frame, cv, arg, items); |
2278 | frame->check = slf_check_semaphore_wait; |
2303 | frame->check = slf_check_semaphore_wait; |
|
|
2304 | } |
2279 | } |
2305 | } |
2280 | |
2306 | |
2281 | /* signal */ |
2307 | /* signal */ |
2282 | |
2308 | |
2283 | static void |
2309 | static void |
… | |
… | |
2990 | RETVAL = coro_new_rouse_cb (aTHX); |
3016 | RETVAL = coro_new_rouse_cb (aTHX); |
2991 | OUTPUT: |
3017 | OUTPUT: |
2992 | RETVAL |
3018 | RETVAL |
2993 | |
3019 | |
2994 | void |
3020 | void |
2995 | rouse_wait (SV *cb = 0) |
3021 | rouse_wait (...) |
2996 | PROTOTYPE: ;$ |
3022 | PROTOTYPE: ;$ |
2997 | PPCODE: |
3023 | PPCODE: |
2998 | CORO_EXECUTE_SLF_XS (slf_init_rouse_wait); |
3024 | CORO_EXECUTE_SLF_XS (slf_init_rouse_wait); |
2999 | |
3025 | |
3000 | |
3026 | |
… | |
… | |
3037 | adjust = 1 |
3063 | adjust = 1 |
3038 | CODE: |
3064 | CODE: |
3039 | coro_semaphore_adjust (aTHX_ (AV *)SvRV (self), ix ? adjust : 1); |
3065 | coro_semaphore_adjust (aTHX_ (AV *)SvRV (self), ix ? adjust : 1); |
3040 | |
3066 | |
3041 | void |
3067 | void |
3042 | down (SV *self) |
3068 | down (...) |
3043 | CODE: |
3069 | CODE: |
3044 | CORO_EXECUTE_SLF_XS (slf_init_semaphore_down); |
3070 | CORO_EXECUTE_SLF_XS (slf_init_semaphore_down); |
3045 | |
3071 | |
3046 | void |
3072 | void |
3047 | wait (SV *self) |
3073 | wait (...) |
3048 | CODE: |
3074 | CODE: |
3049 | CORO_EXECUTE_SLF_XS (slf_init_semaphore_wait); |
3075 | CORO_EXECUTE_SLF_XS (slf_init_semaphore_wait); |
3050 | |
3076 | |
3051 | void |
3077 | void |
3052 | try (SV *self) |
3078 | try (SV *self) |
… | |
… | |
3095 | ); |
3121 | ); |
3096 | OUTPUT: |
3122 | OUTPUT: |
3097 | RETVAL |
3123 | RETVAL |
3098 | |
3124 | |
3099 | void |
3125 | void |
3100 | wait (SV *self) |
3126 | wait (...) |
3101 | CODE: |
3127 | CODE: |
3102 | CORO_EXECUTE_SLF_XS (slf_init_signal_wait); |
3128 | CORO_EXECUTE_SLF_XS (slf_init_signal_wait); |
3103 | |
3129 | |
3104 | void |
3130 | void |
3105 | broadcast (SV *self) |
3131 | broadcast (SV *self) |