… | |
… | |
1668 | } |
1668 | } |
1669 | |
1669 | |
1670 | return 0; |
1670 | return 0; |
1671 | } |
1671 | } |
1672 | |
1672 | |
|
|
1673 | static void |
|
|
1674 | invoke_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 | |
1673 | static int |
1690 | static int |
1674 | api_ready (pTHX_ SV *coro_sv) |
1691 | api_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 | |
1714 | static int |
1709 | static 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 | |
3401 | int |
3406 | int |
3402 | prio (Coro::State coro, int newprio = 0) |
3407 | prio (Coro::State coro, int newprio = 0) |
3403 | PROTOTYPE: $;$ |
3408 | PROTOTYPE: $;$ |
3404 | ALIAS: |
3409 | ALIAS: |