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.341 by root, Mon Dec 15 15:03:31 2008 UTC vs.
Revision 1.346 by root, Tue Jun 9 18:56:45 2009 UTC

1484coro_state_destroy (pTHX_ struct coro *coro) 1484coro_state_destroy (pTHX_ struct coro *coro)
1485{ 1485{
1486 if (coro->flags & CF_DESTROYED) 1486 if (coro->flags & CF_DESTROYED)
1487 return 0; 1487 return 0;
1488 1488
1489 if (coro->on_destroy) 1489 if (coro->on_destroy && !PL_dirty)
1490 coro->on_destroy (aTHX_ coro); 1490 coro->on_destroy (aTHX_ coro);
1491 1491
1492 coro->flags |= CF_DESTROYED; 1492 coro->flags |= CF_DESTROYED;
1493 1493
1494 if (coro->flags & CF_READY) 1494 if (coro->flags & CF_READY)
1988 SV *data = (SV *)GENSUB_ARG; 1988 SV *data = (SV *)GENSUB_ARG;
1989 1989
1990 if (SvTYPE (SvRV (data)) != SVt_PVAV) 1990 if (SvTYPE (SvRV (data)) != SVt_PVAV)
1991 { 1991 {
1992 /* first call, set args */ 1992 /* first call, set args */
1993 SV *coro = SvRV (data);
1993 AV *av = newAV (); 1994 AV *av = newAV ();
1994 SV *coro = SvRV (data);
1995 1995
1996 SvRV_set (data, (SV *)av); 1996 SvRV_set (data, (SV *)av);
1997 api_ready (aTHX_ coro);
1998 SvREFCNT_dec (coro);
1999 1997
2000 /* better take a full copy of the arguments */ 1998 /* better take a full copy of the arguments */
2001 while (items--) 1999 while (items--)
2002 av_store (av, items, newSVsv (ST (items))); 2000 av_store (av, items, newSVsv (ST (items)));
2001
2002 api_ready (aTHX_ coro);
2003 SvREFCNT_dec (coro);
2003 } 2004 }
2004 2005
2005 XSRETURN_EMPTY; 2006 XSRETURN_EMPTY;
2006} 2007}
2007 2008
2024 2025
2025 EXTEND (SP, AvFILLp (av) + 1); 2026 EXTEND (SP, AvFILLp (av) + 1);
2026 for (i = 0; i <= AvFILLp (av); ++i) 2027 for (i = 0; i <= AvFILLp (av); ++i)
2027 PUSHs (sv_2mortal (AvARRAY (av)[i])); 2028 PUSHs (sv_2mortal (AvARRAY (av)[i]));
2028 2029
2029 /* we have stolen the elements, so ste length to zero and free */ 2030 /* we have stolen the elements, so set length to zero and free */
2030 AvFILLp (av) = -1; 2031 AvFILLp (av) = -1;
2031 av_undef (av); 2032 av_undef (av);
2032 2033
2033 PUTBACK; 2034 PUTBACK;
2034 } 2035 }
3098 if (ix) 3099 if (ix)
3099 eval_sv (coderef, 0); 3100 eval_sv (coderef, 0);
3100 else 3101 else
3101 call_sv (coderef, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); 3102 call_sv (coderef, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD);
3102 3103
3104 POPSTACK;
3103 SPAGAIN; 3105 SPAGAIN;
3104 POPSTACK;
3105 3106
3106 if (current != coro) 3107 if (current != coro)
3107 { 3108 {
3108 PUTBACK; 3109 PUTBACK;
3109 save_perl (aTHX_ coro); 3110 save_perl (aTHX_ coro);
3336 RETVAL = coro_nready; 3337 RETVAL = coro_nready;
3337 OUTPUT: 3338 OUTPUT:
3338 RETVAL 3339 RETVAL
3339 3340
3340void 3341void
3342suspend (Coro::State self)
3343 PROTOTYPE: $
3344 CODE:
3345 self->flags |= CF_SUSPENDED;
3346
3347void
3348resume (Coro::State self)
3349 PROTOTYPE: $
3350 CODE:
3351 self->flags &= ~CF_SUSPENDED;
3352
3353void
3341_pool_handler (...) 3354_pool_handler (...)
3342 CODE: 3355 CODE:
3343 CORO_EXECUTE_SLF_XS (slf_init_pool_handler); 3356 CORO_EXECUTE_SLF_XS (slf_init_pool_handler);
3344 3357
3345void 3358void
3418 av_push (*avp, SvREFCNT_inc (block)); 3431 av_push (*avp, SvREFCNT_inc (block));
3419 3432
3420 if (!ix) 3433 if (!ix)
3421 on_enterleave_call (aTHX_ block); 3434 on_enterleave_call (aTHX_ block);
3422 3435
3423 LEAVE; /* pp_entersub unfortunately forces an ENTER/LEAVE around xs calls */ 3436 LEAVE; /* pp_entersub unfortunately forces an ENTER/LEAVE around XS calls */
3424 SAVEDESTRUCTOR_X (ix ? coro_pop_on_leave : coro_pop_on_enter, (void *)coro); 3437 SAVEDESTRUCTOR_X (ix ? coro_pop_on_leave : coro_pop_on_enter, (void *)coro);
3425 ENTER; /* pp_entersub unfortunately forces an ENTER/LEAVE around xs calls */ 3438 ENTER; /* pp_entersub unfortunately forces an ENTER/LEAVE around XS calls */
3426} 3439}
3427 3440
3428 3441
3429MODULE = Coro::State PACKAGE = PerlIO::cede 3442MODULE = Coro::State PACKAGE = PerlIO::cede
3430 3443
3442 GvSTASH (CvGV (cv)) 3455 GvSTASH (CvGV (cv))
3443 ); 3456 );
3444 OUTPUT: 3457 OUTPUT:
3445 RETVAL 3458 RETVAL
3446 3459
3447# helper for Coro::Channel 3460# helper for Coro::Channel and others
3448SV * 3461SV *
3449_alloc (int count) 3462_alloc (int count)
3450 CODE: 3463 CODE:
3451 RETVAL = coro_waitarray_new (aTHX_ count); 3464 RETVAL = coro_waitarray_new (aTHX_ count);
3452 OUTPUT: 3465 OUTPUT:
3510 for (i = 1; i <= wcount; ++i) 3523 for (i = 1; i <= wcount; ++i)
3511 PUSHs (sv_2mortal (newRV_inc (AvARRAY (av)[i]))); 3524 PUSHs (sv_2mortal (newRV_inc (AvARRAY (av)[i])));
3512 } 3525 }
3513} 3526}
3514 3527
3528MODULE = Coro::State PACKAGE = Coro::SemaphoreSet
3529
3530void
3531_may_delete (SV *sem, int count, int extra_refs)
3532 PPCODE:
3533{
3534 AV *av = (AV *)SvRV (sem);
3535
3536 if (SvREFCNT ((SV *)av) == 1 + extra_refs
3537 && AvFILLp (av) == 0 /* no waiters, just count */
3538 && SvIV (AvARRAY (av)[0]) == count)
3539 XSRETURN_YES;
3540
3541 XSRETURN_NO;
3542}
3543
3515MODULE = Coro::State PACKAGE = Coro::Signal 3544MODULE = Coro::State PACKAGE = Coro::Signal
3516 3545
3517SV * 3546SV *
3518new (SV *klass) 3547new (SV *klass)
3519 CODE: 3548 CODE:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines