… | |
… | |
222 | #define MAX_BLOCKTIME 59.743 /* never wait longer than this time (to detect time jumps) */ |
222 | #define MAX_BLOCKTIME 59.743 /* never wait longer than this time (to detect time jumps) */ |
223 | /*#define CLEANUP_INTERVAL (MAX_BLOCKTIME * 5.) /* how often to try to free memory and re-check fds */ |
223 | /*#define CLEANUP_INTERVAL (MAX_BLOCKTIME * 5.) /* how often to try to free memory and re-check fds */ |
224 | |
224 | |
225 | #if __GNUC__ >= 3 |
225 | #if __GNUC__ >= 3 |
226 | # define expect(expr,value) __builtin_expect ((expr),(value)) |
226 | # define expect(expr,value) __builtin_expect ((expr),(value)) |
227 | # define inline_size static inline /* inline for codesize */ |
|
|
228 | # if EV_MINIMAL |
|
|
229 | # define noinline __attribute__ ((noinline)) |
227 | # define noinline __attribute__ ((noinline)) |
230 | # define inline_speed static noinline |
|
|
231 | # else |
|
|
232 | # define noinline |
|
|
233 | # define inline_speed static inline |
|
|
234 | # endif |
|
|
235 | #else |
228 | #else |
236 | # define expect(expr,value) (expr) |
229 | # define expect(expr,value) (expr) |
237 | # define inline_speed static |
|
|
238 | # define inline_size static |
|
|
239 | # define noinline |
230 | # define noinline |
|
|
231 | # if __STDC_VERSION__ < 199901L |
|
|
232 | # define inline |
|
|
233 | # endif |
240 | #endif |
234 | #endif |
241 | |
235 | |
242 | #define expect_false(expr) expect ((expr) != 0, 0) |
236 | #define expect_false(expr) expect ((expr) != 0, 0) |
243 | #define expect_true(expr) expect ((expr) != 0, 1) |
237 | #define expect_true(expr) expect ((expr) != 0, 1) |
|
|
238 | #define inline_size static inline |
|
|
239 | |
|
|
240 | #if EV_MINIMAL |
|
|
241 | # define inline_speed static noinline |
|
|
242 | #else |
|
|
243 | # define inline_speed static inline |
|
|
244 | #endif |
244 | |
245 | |
245 | #define NUMPRI (EV_MAXPRI - EV_MINPRI + 1) |
246 | #define NUMPRI (EV_MAXPRI - EV_MINPRI + 1) |
246 | #define ABSPRI(w) (((W)w)->priority - EV_MINPRI) |
247 | #define ABSPRI(w) (((W)w)->priority - EV_MINPRI) |
247 | |
248 | |
248 | #define EMPTY /* required for microsofts broken pseudo-c compiler */ |
249 | #define EMPTY /* required for microsofts broken pseudo-c compiler */ |
… | |
… | |
507 | } |
508 | } |
508 | |
509 | |
509 | void |
510 | void |
510 | ev_feed_fd_event (EV_P_ int fd, int revents) |
511 | ev_feed_fd_event (EV_P_ int fd, int revents) |
511 | { |
512 | { |
|
|
513 | if (fd >= 0 && fd < anfdmax) |
512 | fd_event (EV_A_ fd, revents); |
514 | fd_event (EV_A_ fd, revents); |
513 | } |
515 | } |
514 | |
516 | |
515 | void inline_size |
517 | void inline_size |
516 | fd_reify (EV_P) |
518 | fd_reify (EV_P) |
517 | { |
519 | { |
… | |
… | |
1162 | if (backend) |
1164 | if (backend) |
1163 | postfork = 1; |
1165 | postfork = 1; |
1164 | } |
1166 | } |
1165 | |
1167 | |
1166 | /*****************************************************************************/ |
1168 | /*****************************************************************************/ |
|
|
1169 | |
|
|
1170 | void |
|
|
1171 | ev_invoke (EV_P_ void *w, int revents) |
|
|
1172 | { |
|
|
1173 | EV_CB_INVOKE ((W)w, revents); |
|
|
1174 | } |
1167 | |
1175 | |
1168 | void inline_speed |
1176 | void inline_speed |
1169 | call_pending (EV_P) |
1177 | call_pending (EV_P) |
1170 | { |
1178 | { |
1171 | int pri; |
1179 | int pri; |
… | |
… | |
1266 | |
1274 | |
1267 | #if EV_IDLE_ENABLE |
1275 | #if EV_IDLE_ENABLE |
1268 | void inline_size |
1276 | void inline_size |
1269 | idle_reify (EV_P) |
1277 | idle_reify (EV_P) |
1270 | { |
1278 | { |
1271 | if (expect_false (!idleall)) |
1279 | if (expect_false (idleall)) |
1272 | { |
1280 | { |
1273 | int pri; |
1281 | int pri; |
1274 | |
1282 | |
1275 | for (pri = NUMPRI; pri--; ) |
1283 | for (pri = NUMPRI; pri--; ) |
1276 | { |
1284 | { |
… | |
… | |
1523 | head = &(*head)->next; |
1531 | head = &(*head)->next; |
1524 | } |
1532 | } |
1525 | } |
1533 | } |
1526 | |
1534 | |
1527 | void inline_speed |
1535 | void inline_speed |
1528 | ev_clear_pending (EV_P_ W w) |
1536 | clear_pending (EV_P_ W w) |
1529 | { |
1537 | { |
1530 | if (w->pending) |
1538 | if (w->pending) |
1531 | { |
1539 | { |
1532 | pendings [ABSPRI (w)][w->pending - 1].w = 0; |
1540 | pendings [ABSPRI (w)][w->pending - 1].w = 0; |
1533 | w->pending = 0; |
1541 | w->pending = 0; |
1534 | } |
1542 | } |
|
|
1543 | } |
|
|
1544 | |
|
|
1545 | int |
|
|
1546 | ev_clear_pending (EV_P_ void *w) |
|
|
1547 | { |
|
|
1548 | W w_ = (W)w; |
|
|
1549 | int pending = w_->pending; |
|
|
1550 | |
|
|
1551 | if (!pending) |
|
|
1552 | return 0; |
|
|
1553 | |
|
|
1554 | w_->pending = 0; |
|
|
1555 | ANPENDING *p = pendings [ABSPRI (w_)] + pending - 1; |
|
|
1556 | p->w = 0; |
|
|
1557 | |
|
|
1558 | return p->events; |
1535 | } |
1559 | } |
1536 | |
1560 | |
1537 | void inline_size |
1561 | void inline_size |
1538 | pri_adjust (EV_P_ W w) |
1562 | pri_adjust (EV_P_ W w) |
1539 | { |
1563 | { |
… | |
… | |
1578 | } |
1602 | } |
1579 | |
1603 | |
1580 | void |
1604 | void |
1581 | ev_io_stop (EV_P_ ev_io *w) |
1605 | ev_io_stop (EV_P_ ev_io *w) |
1582 | { |
1606 | { |
1583 | ev_clear_pending (EV_A_ (W)w); |
1607 | clear_pending (EV_A_ (W)w); |
1584 | if (expect_false (!ev_is_active (w))) |
1608 | if (expect_false (!ev_is_active (w))) |
1585 | return; |
1609 | return; |
1586 | |
1610 | |
1587 | assert (("ev_io_start called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); |
1611 | assert (("ev_io_start called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); |
1588 | |
1612 | |
… | |
… | |
1611 | } |
1635 | } |
1612 | |
1636 | |
1613 | void |
1637 | void |
1614 | ev_timer_stop (EV_P_ ev_timer *w) |
1638 | ev_timer_stop (EV_P_ ev_timer *w) |
1615 | { |
1639 | { |
1616 | ev_clear_pending (EV_A_ (W)w); |
1640 | clear_pending (EV_A_ (W)w); |
1617 | if (expect_false (!ev_is_active (w))) |
1641 | if (expect_false (!ev_is_active (w))) |
1618 | return; |
1642 | return; |
1619 | |
1643 | |
1620 | assert (("internal timer heap corruption", timers [((W)w)->active - 1] == w)); |
1644 | assert (("internal timer heap corruption", timers [((W)w)->active - 1] == w)); |
1621 | |
1645 | |
… | |
… | |
1679 | } |
1703 | } |
1680 | |
1704 | |
1681 | void |
1705 | void |
1682 | ev_periodic_stop (EV_P_ ev_periodic *w) |
1706 | ev_periodic_stop (EV_P_ ev_periodic *w) |
1683 | { |
1707 | { |
1684 | ev_clear_pending (EV_A_ (W)w); |
1708 | clear_pending (EV_A_ (W)w); |
1685 | if (expect_false (!ev_is_active (w))) |
1709 | if (expect_false (!ev_is_active (w))) |
1686 | return; |
1710 | return; |
1687 | |
1711 | |
1688 | assert (("internal periodic heap corruption", periodics [((W)w)->active - 1] == w)); |
1712 | assert (("internal periodic heap corruption", periodics [((W)w)->active - 1] == w)); |
1689 | |
1713 | |
… | |
… | |
1743 | } |
1767 | } |
1744 | |
1768 | |
1745 | void |
1769 | void |
1746 | ev_signal_stop (EV_P_ ev_signal *w) |
1770 | ev_signal_stop (EV_P_ ev_signal *w) |
1747 | { |
1771 | { |
1748 | ev_clear_pending (EV_A_ (W)w); |
1772 | clear_pending (EV_A_ (W)w); |
1749 | if (expect_false (!ev_is_active (w))) |
1773 | if (expect_false (!ev_is_active (w))) |
1750 | return; |
1774 | return; |
1751 | |
1775 | |
1752 | wlist_del ((WL *)&signals [w->signum - 1].head, (WL)w); |
1776 | wlist_del ((WL *)&signals [w->signum - 1].head, (WL)w); |
1753 | ev_stop (EV_A_ (W)w); |
1777 | ev_stop (EV_A_ (W)w); |
… | |
… | |
1770 | } |
1794 | } |
1771 | |
1795 | |
1772 | void |
1796 | void |
1773 | ev_child_stop (EV_P_ ev_child *w) |
1797 | ev_child_stop (EV_P_ ev_child *w) |
1774 | { |
1798 | { |
1775 | ev_clear_pending (EV_A_ (W)w); |
1799 | clear_pending (EV_A_ (W)w); |
1776 | if (expect_false (!ev_is_active (w))) |
1800 | if (expect_false (!ev_is_active (w))) |
1777 | return; |
1801 | return; |
1778 | |
1802 | |
1779 | wlist_del ((WL *)&childs [w->pid & (EV_PID_HASHSIZE - 1)], (WL)w); |
1803 | wlist_del ((WL *)&childs [w->pid & (EV_PID_HASHSIZE - 1)], (WL)w); |
1780 | ev_stop (EV_A_ (W)w); |
1804 | ev_stop (EV_A_ (W)w); |
… | |
… | |
2016 | } |
2040 | } |
2017 | |
2041 | |
2018 | void |
2042 | void |
2019 | ev_stat_stop (EV_P_ ev_stat *w) |
2043 | ev_stat_stop (EV_P_ ev_stat *w) |
2020 | { |
2044 | { |
2021 | ev_clear_pending (EV_A_ (W)w); |
2045 | clear_pending (EV_A_ (W)w); |
2022 | if (expect_false (!ev_is_active (w))) |
2046 | if (expect_false (!ev_is_active (w))) |
2023 | return; |
2047 | return; |
2024 | |
2048 | |
2025 | #if EV_USE_INOTIFY |
2049 | #if EV_USE_INOTIFY |
2026 | infy_del (EV_A_ w); |
2050 | infy_del (EV_A_ w); |
… | |
… | |
2052 | } |
2076 | } |
2053 | |
2077 | |
2054 | void |
2078 | void |
2055 | ev_idle_stop (EV_P_ ev_idle *w) |
2079 | ev_idle_stop (EV_P_ ev_idle *w) |
2056 | { |
2080 | { |
2057 | ev_clear_pending (EV_A_ (W)w); |
2081 | clear_pending (EV_A_ (W)w); |
2058 | if (expect_false (!ev_is_active (w))) |
2082 | if (expect_false (!ev_is_active (w))) |
2059 | return; |
2083 | return; |
2060 | |
2084 | |
2061 | { |
2085 | { |
2062 | int active = ((W)w)->active; |
2086 | int active = ((W)w)->active; |
… | |
… | |
2082 | } |
2106 | } |
2083 | |
2107 | |
2084 | void |
2108 | void |
2085 | ev_prepare_stop (EV_P_ ev_prepare *w) |
2109 | ev_prepare_stop (EV_P_ ev_prepare *w) |
2086 | { |
2110 | { |
2087 | ev_clear_pending (EV_A_ (W)w); |
2111 | clear_pending (EV_A_ (W)w); |
2088 | if (expect_false (!ev_is_active (w))) |
2112 | if (expect_false (!ev_is_active (w))) |
2089 | return; |
2113 | return; |
2090 | |
2114 | |
2091 | { |
2115 | { |
2092 | int active = ((W)w)->active; |
2116 | int active = ((W)w)->active; |
… | |
… | |
2109 | } |
2133 | } |
2110 | |
2134 | |
2111 | void |
2135 | void |
2112 | ev_check_stop (EV_P_ ev_check *w) |
2136 | ev_check_stop (EV_P_ ev_check *w) |
2113 | { |
2137 | { |
2114 | ev_clear_pending (EV_A_ (W)w); |
2138 | clear_pending (EV_A_ (W)w); |
2115 | if (expect_false (!ev_is_active (w))) |
2139 | if (expect_false (!ev_is_active (w))) |
2116 | return; |
2140 | return; |
2117 | |
2141 | |
2118 | { |
2142 | { |
2119 | int active = ((W)w)->active; |
2143 | int active = ((W)w)->active; |
… | |
… | |
2161 | } |
2185 | } |
2162 | |
2186 | |
2163 | void |
2187 | void |
2164 | ev_embed_stop (EV_P_ ev_embed *w) |
2188 | ev_embed_stop (EV_P_ ev_embed *w) |
2165 | { |
2189 | { |
2166 | ev_clear_pending (EV_A_ (W)w); |
2190 | clear_pending (EV_A_ (W)w); |
2167 | if (expect_false (!ev_is_active (w))) |
2191 | if (expect_false (!ev_is_active (w))) |
2168 | return; |
2192 | return; |
2169 | |
2193 | |
2170 | ev_io_stop (EV_A_ &w->io); |
2194 | ev_io_stop (EV_A_ &w->io); |
2171 | |
2195 | |
… | |
… | |
2186 | } |
2210 | } |
2187 | |
2211 | |
2188 | void |
2212 | void |
2189 | ev_fork_stop (EV_P_ ev_fork *w) |
2213 | ev_fork_stop (EV_P_ ev_fork *w) |
2190 | { |
2214 | { |
2191 | ev_clear_pending (EV_A_ (W)w); |
2215 | clear_pending (EV_A_ (W)w); |
2192 | if (expect_false (!ev_is_active (w))) |
2216 | if (expect_false (!ev_is_active (w))) |
2193 | return; |
2217 | return; |
2194 | |
2218 | |
2195 | { |
2219 | { |
2196 | int active = ((W)w)->active; |
2220 | int active = ((W)w)->active; |