… | |
… | |
32 | #ifdef __cplusplus |
32 | #ifdef __cplusplus |
33 | extern "C" { |
33 | extern "C" { |
34 | #endif |
34 | #endif |
35 | |
35 | |
36 | #ifndef EV_STANDALONE |
36 | #ifndef EV_STANDALONE |
|
|
37 | # ifdef EV_CONFIG_H |
|
|
38 | # include EV_CONFIG_H |
|
|
39 | # else |
37 | # include "config.h" |
40 | # include "config.h" |
|
|
41 | # endif |
38 | |
42 | |
39 | # if HAVE_CLOCK_GETTIME |
43 | # if HAVE_CLOCK_GETTIME |
40 | # ifndef EV_USE_MONOTONIC |
44 | # ifndef EV_USE_MONOTONIC |
41 | # define EV_USE_MONOTONIC 1 |
45 | # define EV_USE_MONOTONIC 1 |
42 | # endif |
46 | # endif |
… | |
… | |
393 | { |
397 | { |
394 | pendings [ABSPRI (w_)][w_->pending - 1].events |= revents; |
398 | pendings [ABSPRI (w_)][w_->pending - 1].events |= revents; |
395 | return; |
399 | return; |
396 | } |
400 | } |
397 | |
401 | |
|
|
402 | if (expect_false (!w_->cb)) |
|
|
403 | return; |
|
|
404 | |
398 | w_->pending = ++pendingcnt [ABSPRI (w_)]; |
405 | w_->pending = ++pendingcnt [ABSPRI (w_)]; |
399 | array_needsize (ANPENDING, pendings [ABSPRI (w_)], pendingmax [ABSPRI (w_)], pendingcnt [ABSPRI (w_)], EMPTY2); |
406 | array_needsize (ANPENDING, pendings [ABSPRI (w_)], pendingmax [ABSPRI (w_)], pendingcnt [ABSPRI (w_)], EMPTY2); |
400 | pendings [ABSPRI (w_)][w_->pending - 1].w = w_; |
407 | pendings [ABSPRI (w_)][w_->pending - 1].w = w_; |
401 | pendings [ABSPRI (w_)][w_->pending - 1].events = revents; |
408 | pendings [ABSPRI (w_)][w_->pending - 1].events = revents; |
402 | } |
409 | } |
… | |
… | |
809 | // flags &= ~EVBACKEND_KQUEUE; for documentation |
816 | // flags &= ~EVBACKEND_KQUEUE; for documentation |
810 | flags &= ~EVBACKEND_POLL; |
817 | flags &= ~EVBACKEND_POLL; |
811 | #endif |
818 | #endif |
812 | |
819 | |
813 | return flags; |
820 | return flags; |
|
|
821 | } |
|
|
822 | |
|
|
823 | unsigned int |
|
|
824 | ev_embeddable_backends (void) |
|
|
825 | { |
|
|
826 | return EVBACKEND_EPOLL |
|
|
827 | | EVBACKEND_KQUEUE |
|
|
828 | | EVBACKEND_PORT; |
814 | } |
829 | } |
815 | |
830 | |
816 | unsigned int |
831 | unsigned int |
817 | ev_backend (EV_P) |
832 | ev_backend (EV_P) |
818 | { |
833 | { |
… | |
… | |
1655 | |
1670 | |
1656 | wlist_del ((WL *)&childs [w->pid & (PID_HASHSIZE - 1)], (WL)w); |
1671 | wlist_del ((WL *)&childs [w->pid & (PID_HASHSIZE - 1)], (WL)w); |
1657 | ev_stop (EV_A_ (W)w); |
1672 | ev_stop (EV_A_ (W)w); |
1658 | } |
1673 | } |
1659 | |
1674 | |
|
|
1675 | #if EV_MULTIPLICITY |
|
|
1676 | static void |
|
|
1677 | embed_cb (EV_P_ struct ev_io *io, int revents) |
|
|
1678 | { |
|
|
1679 | struct ev_embed *w = (struct ev_embed *)(((char *)io) - offsetof (struct ev_embed, io)); |
|
|
1680 | |
|
|
1681 | ev_feed_event (EV_A_ (W)w, EV_EMBED); |
|
|
1682 | ev_loop (w->loop, EVLOOP_NONBLOCK); |
|
|
1683 | } |
|
|
1684 | |
|
|
1685 | void |
|
|
1686 | ev_embed_start (EV_P_ struct ev_embed *w) |
|
|
1687 | { |
|
|
1688 | if (expect_false (ev_is_active (w))) |
|
|
1689 | return; |
|
|
1690 | |
|
|
1691 | { |
|
|
1692 | struct ev_loop *loop = w->loop; |
|
|
1693 | assert (("loop to be embedded is not embeddable", backend & ev_embeddable_backends ())); |
|
|
1694 | ev_io_init (&w->io, embed_cb, backend_fd, EV_READ); |
|
|
1695 | } |
|
|
1696 | |
|
|
1697 | ev_io_start (EV_A_ &w->io); |
|
|
1698 | ev_start (EV_A_ (W)w, 1); |
|
|
1699 | } |
|
|
1700 | |
|
|
1701 | void |
|
|
1702 | ev_embed_stop (EV_P_ struct ev_embed *w) |
|
|
1703 | { |
|
|
1704 | ev_clear_pending (EV_A_ (W)w); |
|
|
1705 | if (expect_false (!ev_is_active (w))) |
|
|
1706 | return; |
|
|
1707 | |
|
|
1708 | ev_io_stop (EV_A_ &w->io); |
|
|
1709 | ev_stop (EV_A_ (W)w); |
|
|
1710 | } |
|
|
1711 | #endif |
|
|
1712 | |
1660 | /*****************************************************************************/ |
1713 | /*****************************************************************************/ |
1661 | |
1714 | |
1662 | struct ev_once |
1715 | struct ev_once |
1663 | { |
1716 | { |
1664 | struct ev_io io; |
1717 | struct ev_io io; |