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.364 by root, Thu Jul 16 02:19:17 2009 UTC vs.
Revision 1.365 by root, Mon Jul 20 16:18:30 2009 UTC

1668 } 1668 }
1669 1669
1670 return 0; 1670 return 0;
1671} 1671}
1672 1672
1673static void
1674invoke_sv_ready_hook_helper (void)
1675{
1676 dTHX;
1677 dSP;
1678
1679 ENTER;
1680 SAVETMPS;
1681
1682 PUSHMARK (SP);
1683 PUTBACK;
1684 call_sv (coro_readyhook, G_VOID | G_DISCARD);
1685
1686 FREETMPS;
1687 LEAVE;
1688}
1689
1673static int 1690static int
1674api_ready (pTHX_ SV *coro_sv) 1691api_ready (pTHX_ SV *coro_sv)
1675{ 1692{
1676 struct coro *coro;
1677 SV *sv_hook;
1678 void (*xs_hook)(void);
1679
1680 coro = SvSTATE (coro_sv); 1693 struct coro *coro = SvSTATE (coro_sv);
1681 1694
1682 if (coro->flags & CF_READY) 1695 if (coro->flags & CF_READY)
1683 return 0; 1696 return 0;
1684 1697
1685 coro->flags |= CF_READY; 1698 coro->flags |= CF_READY;
1686 1699
1687 sv_hook = coro_nready ? 0 : coro_readyhook;
1688 xs_hook = coro_nready ? 0 : coroapi.readyhook;
1689
1690 coro_enq (aTHX_ coro); 1700 coro_enq (aTHX_ coro);
1691 ++coro_nready;
1692 1701
1693 if (sv_hook) 1702 if (!coro_nready++)
1694 { 1703 if (coroapi.readyhook)
1695 dSP; 1704 coroapi.readyhook ();
1696
1697 ENTER;
1698 SAVETMPS;
1699
1700 PUSHMARK (SP);
1701 PUTBACK;
1702 call_sv (sv_hook, G_VOID | G_DISCARD);
1703
1704 FREETMPS;
1705 LEAVE;
1706 }
1707
1708 if (xs_hook)
1709 xs_hook ();
1710 1705
1711 return 1; 1706 return 1;
1712} 1707}
1713 1708
1714static int 1709static int
3394_set_readyhook (SV *hook) 3389_set_readyhook (SV *hook)
3395 PROTOTYPE: $ 3390 PROTOTYPE: $
3396 CODE: 3391 CODE:
3397 SvREFCNT_dec (coro_readyhook); 3392 SvREFCNT_dec (coro_readyhook);
3398 SvGETMAGIC (hook); 3393 SvGETMAGIC (hook);
3394 if (SvOK (hook))
3395 {
3399 coro_readyhook = SvOK (hook) ? newSVsv (hook) : 0; 3396 coro_readyhook = newSVsv (hook);
3397 CORO_READYHOOK = invoke_sv_ready_hook_helper;
3398 CORO_READYHOOK ();
3399 }
3400 else
3401 {
3402 coro_readyhook = 0;
3403 CORO_READYHOOK = 0;
3404 }
3400 3405
3401int 3406int
3402prio (Coro::State coro, int newprio = 0) 3407prio (Coro::State coro, int newprio = 0)
3403 PROTOTYPE: $;$ 3408 PROTOTYPE: $;$
3404 ALIAS: 3409 ALIAS:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines