… | |
… | |
127 | .\} |
127 | .\} |
128 | .rm #[ #] #H #V #F C |
128 | .rm #[ #] #H #V #F C |
129 | .\" ======================================================================== |
129 | .\" ======================================================================== |
130 | .\" |
130 | .\" |
131 | .IX Title "EV 1" |
131 | .IX Title "EV 1" |
132 | .TH EV 1 "2007-12-22" "perl v5.8.8" "User Contributed Perl Documentation" |
132 | .TH EV 1 "2007-12-25" "perl v5.8.8" "User Contributed Perl Documentation" |
133 | .SH "NAME" |
133 | .SH "NAME" |
134 | libev \- a high performance full\-featured event loop written in C |
134 | libev \- a high performance full\-featured event loop written in C |
135 | .SH "SYNOPSIS" |
135 | .SH "SYNOPSIS" |
136 | .IX Header "SYNOPSIS" |
136 | .IX Header "SYNOPSIS" |
137 | .Vb 1 |
137 | .Vb 1 |
138 | \& #include <ev.h> |
138 | \& #include <ev.h> |
139 | .Ve |
139 | .Ve |
140 | .SH "EXAMPLE PROGRAM" |
140 | .Sh "\s-1EXAMPLE\s0 \s-1PROGRAM\s0" |
141 | .IX Header "EXAMPLE PROGRAM" |
141 | .IX Subsection "EXAMPLE PROGRAM" |
142 | .Vb 1 |
142 | .Vb 1 |
143 | \& #include <ev.h> |
143 | \& #include <ev.h> |
144 | .Ve |
144 | .Ve |
145 | .PP |
145 | .PP |
146 | .Vb 2 |
146 | .Vb 2 |
… | |
… | |
212 | .PP |
212 | .PP |
213 | You register interest in certain events by registering so-called \fIevent |
213 | You register interest in certain events by registering so-called \fIevent |
214 | watchers\fR, which are relatively small C structures you initialise with the |
214 | watchers\fR, which are relatively small C structures you initialise with the |
215 | details of the event, and then hand it over to libev by \fIstarting\fR the |
215 | details of the event, and then hand it over to libev by \fIstarting\fR the |
216 | watcher. |
216 | watcher. |
217 | .SH "FEATURES" |
217 | .Sh "\s-1FEATURES\s0" |
218 | .IX Header "FEATURES" |
218 | .IX Subsection "FEATURES" |
219 | Libev supports \f(CW\*(C`select\*(C'\fR, \f(CW\*(C`poll\*(C'\fR, the Linux-specific \f(CW\*(C`epoll\*(C'\fR, the |
219 | Libev supports \f(CW\*(C`select\*(C'\fR, \f(CW\*(C`poll\*(C'\fR, the Linux-specific \f(CW\*(C`epoll\*(C'\fR, the |
220 | BSD-specific \f(CW\*(C`kqueue\*(C'\fR and the Solaris-specific event port mechanisms |
220 | BSD-specific \f(CW\*(C`kqueue\*(C'\fR and the Solaris-specific event port mechanisms |
221 | for file descriptor events (\f(CW\*(C`ev_io\*(C'\fR), the Linux \f(CW\*(C`inotify\*(C'\fR interface |
221 | for file descriptor events (\f(CW\*(C`ev_io\*(C'\fR), the Linux \f(CW\*(C`inotify\*(C'\fR interface |
222 | (for \f(CW\*(C`ev_stat\*(C'\fR), relative timers (\f(CW\*(C`ev_timer\*(C'\fR), absolute timers |
222 | (for \f(CW\*(C`ev_stat\*(C'\fR), relative timers (\f(CW\*(C`ev_timer\*(C'\fR), absolute timers |
223 | with customised rescheduling (\f(CW\*(C`ev_periodic\*(C'\fR), synchronous signals |
223 | with customised rescheduling (\f(CW\*(C`ev_periodic\*(C'\fR), synchronous signals |
… | |
… | |
228 | (\f(CW\*(C`ev_fork\*(C'\fR). |
228 | (\f(CW\*(C`ev_fork\*(C'\fR). |
229 | .PP |
229 | .PP |
230 | It also is quite fast (see this |
230 | It also is quite fast (see this |
231 | benchmark comparing it to libevent |
231 | benchmark comparing it to libevent |
232 | for example). |
232 | for example). |
233 | .SH "CONVENTIONS" |
233 | .Sh "\s-1CONVENTIONS\s0" |
234 | .IX Header "CONVENTIONS" |
234 | .IX Subsection "CONVENTIONS" |
235 | Libev is very configurable. In this manual the default configuration will |
235 | Libev is very configurable. In this manual the default configuration will |
236 | be described, which supports multiple event loops. For more info about |
236 | be described, which supports multiple event loops. For more info about |
237 | various configuration options please have a look at \fB\s-1EMBED\s0\fR section in |
237 | various configuration options please have a look at \fB\s-1EMBED\s0\fR section in |
238 | this manual. If libev was configured without support for multiple event |
238 | this manual. If libev was configured without support for multiple event |
239 | loops, then all functions taking an initial argument of name \f(CW\*(C`loop\*(C'\fR |
239 | loops, then all functions taking an initial argument of name \f(CW\*(C`loop\*(C'\fR |
240 | (which is always of type \f(CW\*(C`struct ev_loop *\*(C'\fR) will not have this argument. |
240 | (which is always of type \f(CW\*(C`struct ev_loop *\*(C'\fR) will not have this argument. |
241 | .SH "TIME REPRESENTATION" |
241 | .Sh "\s-1TIME\s0 \s-1REPRESENTATION\s0" |
242 | .IX Header "TIME REPRESENTATION" |
242 | .IX Subsection "TIME REPRESENTATION" |
243 | Libev represents time as a single floating point number, representing the |
243 | Libev represents time as a single floating point number, representing the |
244 | (fractional) number of seconds since the (\s-1POSIX\s0) epoch (somewhere near |
244 | (fractional) number of seconds since the (\s-1POSIX\s0) epoch (somewhere near |
245 | the beginning of 1970, details are complicated, don't ask). This type is |
245 | the beginning of 1970, details are complicated, don't ask). This type is |
246 | called \f(CW\*(C`ev_tstamp\*(C'\fR, which is what you should use too. It usually aliases |
246 | called \f(CW\*(C`ev_tstamp\*(C'\fR, which is what you should use too. It usually aliases |
247 | to the \f(CW\*(C`double\*(C'\fR type in C, and when you need to do any calculations on |
247 | to the \f(CW\*(C`double\*(C'\fR type in C, and when you need to do any calculations on |
… | |
… | |
1138 | In general you can register as many read and/or write event watchers per |
1138 | In general you can register as many read and/or write event watchers per |
1139 | fd as you want (as long as you don't confuse yourself). Setting all file |
1139 | fd as you want (as long as you don't confuse yourself). Setting all file |
1140 | descriptors to non-blocking mode is also usually a good idea (but not |
1140 | descriptors to non-blocking mode is also usually a good idea (but not |
1141 | required if you know what you are doing). |
1141 | required if you know what you are doing). |
1142 | .PP |
1142 | .PP |
1143 | You have to be careful with dup'ed file descriptors, though. Some backends |
|
|
1144 | (the linux epoll backend is a notable example) cannot handle dup'ed file |
|
|
1145 | descriptors correctly if you register interest in two or more fds pointing |
|
|
1146 | to the same underlying file/socket/etc. description (that is, they share |
|
|
1147 | the same underlying \*(L"file open\*(R"). |
|
|
1148 | .PP |
|
|
1149 | If you must do this, then force the use of a known-to-be-good backend |
1143 | If you must do this, then force the use of a known-to-be-good backend |
1150 | (at the time of this writing, this includes only \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR and |
1144 | (at the time of this writing, this includes only \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR and |
1151 | \&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR). |
1145 | \&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR). |
1152 | .PP |
1146 | .PP |
1153 | Another thing you have to watch out for is that it is quite easy to |
1147 | Another thing you have to watch out for is that it is quite easy to |
… | |
… | |
1189 | .PP |
1183 | .PP |
1190 | \fIThe special problem of dup'ed file descriptors\fR |
1184 | \fIThe special problem of dup'ed file descriptors\fR |
1191 | .IX Subsection "The special problem of dup'ed file descriptors" |
1185 | .IX Subsection "The special problem of dup'ed file descriptors" |
1192 | .PP |
1186 | .PP |
1193 | Some backends (e.g. epoll), cannot register events for file descriptors, |
1187 | Some backends (e.g. epoll), cannot register events for file descriptors, |
1194 | but only events for the underlying file descriptions. That menas when you |
1188 | but only events for the underlying file descriptions. That means when you |
1195 | have \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors and register events for them, only one |
1189 | have \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors or weirder constellations, and register |
1196 | file descriptor might actually receive events. |
1190 | events for them, only one file descriptor might actually receive events. |
1197 | .PP |
1191 | .PP |
1198 | There is no workaorund possible except not registering events |
1192 | There is no workaround possible except not registering events |
1199 | for potentially \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors or to resort to |
1193 | for potentially \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors, or to resort to |
1200 | \&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. |
1194 | \&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. |
1201 | .PP |
1195 | .PP |
1202 | \fIThe special problem of fork\fR |
1196 | \fIThe special problem of fork\fR |
1203 | .IX Subsection "The special problem of fork" |
1197 | .IX Subsection "The special problem of fork" |
1204 | .PP |
1198 | .PP |
… | |
… | |
1659 | reader). Inotify will be used to give hints only and should not change the |
1653 | reader). Inotify will be used to give hints only and should not change the |
1660 | semantics of \f(CW\*(C`ev_stat\*(C'\fR watchers, which means that libev sometimes needs |
1654 | semantics of \f(CW\*(C`ev_stat\*(C'\fR watchers, which means that libev sometimes needs |
1661 | to fall back to regular polling again even with inotify, but changes are |
1655 | to fall back to regular polling again even with inotify, but changes are |
1662 | usually detected immediately, and if the file exists there will be no |
1656 | usually detected immediately, and if the file exists there will be no |
1663 | polling. |
1657 | polling. |
|
|
1658 | .PP |
|
|
1659 | \fIInotify\fR |
|
|
1660 | .IX Subsection "Inotify" |
|
|
1661 | .PP |
|
|
1662 | When \f(CW\*(C`inotify (7)\*(C'\fR support has been compiled into libev (generally only |
|
|
1663 | available on Linux) and present at runtime, it will be used to speed up |
|
|
1664 | change detection where possible. The inotify descriptor will be created lazily |
|
|
1665 | when the first \f(CW\*(C`ev_stat\*(C'\fR watcher is being started. |
|
|
1666 | .PP |
|
|
1667 | Inotify presense does not change the semantics of \f(CW\*(C`ev_stat\*(C'\fR watchers |
|
|
1668 | except that changes might be detected earlier, and in some cases, to avoid |
|
|
1669 | making regular \f(CW\*(C`stat\*(C'\fR calls. Even in the presense of inotify support |
|
|
1670 | there are many cases where libev has to resort to regular \f(CW\*(C`stat\*(C'\fR polling. |
|
|
1671 | .PP |
|
|
1672 | (There is no support for kqueue, as apparently it cannot be used to |
|
|
1673 | implement this functionality, due to the requirement of having a file |
|
|
1674 | descriptor open on the object at all times). |
|
|
1675 | .PP |
|
|
1676 | \fIThe special problem of stat time resolution\fR |
|
|
1677 | .IX Subsection "The special problem of stat time resolution" |
|
|
1678 | .PP |
|
|
1679 | The \f(CW\*(C`stat ()\*(C'\fR syscall only supports full-second resolution portably, and |
|
|
1680 | even on systems where the resolution is higher, many filesystems still |
|
|
1681 | only support whole seconds. |
|
|
1682 | .PP |
|
|
1683 | That means that, if the time is the only thing that changes, you might |
|
|
1684 | miss updates: on the first update, \f(CW\*(C`ev_stat\*(C'\fR detects a change and calls |
|
|
1685 | your callback, which does something. When there is another update within |
|
|
1686 | the same second, \f(CW\*(C`ev_stat\*(C'\fR will be unable to detect it. |
|
|
1687 | .PP |
|
|
1688 | The solution to this is to delay acting on a change for a second (or till |
|
|
1689 | the next second boundary), using a roughly one-second delay \f(CW\*(C`ev_timer\*(C'\fR |
|
|
1690 | (\f(CW\*(C`ev_timer_set (w, 0., 1.01); ev_timer_again (loop, w)\*(C'\fR). The \f(CW.01\fR |
|
|
1691 | is added to work around small timing inconsistencies of some operating |
|
|
1692 | systems. |
1664 | .PP |
1693 | .PP |
1665 | \fIWatcher-Specific Functions and Data Members\fR |
1694 | \fIWatcher-Specific Functions and Data Members\fR |
1666 | .IX Subsection "Watcher-Specific Functions and Data Members" |
1695 | .IX Subsection "Watcher-Specific Functions and Data Members" |
1667 | .IP "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" 4 |
1696 | .IP "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" 4 |
1668 | .IX Item "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" |
1697 | .IX Item "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" |
… | |
… | |
1700 | The specified interval. |
1729 | The specified interval. |
1701 | .IP "const char *path [read\-only]" 4 |
1730 | .IP "const char *path [read\-only]" 4 |
1702 | .IX Item "const char *path [read-only]" |
1731 | .IX Item "const char *path [read-only]" |
1703 | The filesystem path that is being watched. |
1732 | The filesystem path that is being watched. |
1704 | .PP |
1733 | .PP |
|
|
1734 | \fIExamples\fR |
|
|
1735 | .IX Subsection "Examples" |
|
|
1736 | .PP |
1705 | Example: Watch \f(CW\*(C`/etc/passwd\*(C'\fR for attribute changes. |
1737 | Example: Watch \f(CW\*(C`/etc/passwd\*(C'\fR for attribute changes. |
1706 | .PP |
1738 | .PP |
1707 | .Vb 15 |
1739 | .Vb 15 |
1708 | \& static void |
1740 | \& static void |
1709 | \& passwd_cb (struct ev_loop *loop, ev_stat *w, int revents) |
1741 | \& passwd_cb (struct ev_loop *loop, ev_stat *w, int revents) |
… | |
… | |
1726 | \& ... |
1758 | \& ... |
1727 | \& ev_stat passwd; |
1759 | \& ev_stat passwd; |
1728 | .Ve |
1760 | .Ve |
1729 | .PP |
1761 | .PP |
1730 | .Vb 2 |
1762 | .Vb 2 |
1731 | \& ev_stat_init (&passwd, passwd_cb, "/etc/passwd"); |
1763 | \& ev_stat_init (&passwd, passwd_cb, "/etc/passwd", 0.); |
1732 | \& ev_stat_start (loop, &passwd); |
1764 | \& ev_stat_start (loop, &passwd); |
|
|
1765 | .Ve |
|
|
1766 | .PP |
|
|
1767 | Example: Like above, but additionally use a one-second delay so we do not |
|
|
1768 | miss updates (however, frequent updates will delay processing, too, so |
|
|
1769 | one might do the work both on \f(CW\*(C`ev_stat\*(C'\fR callback invocation \fIand\fR on |
|
|
1770 | \&\f(CW\*(C`ev_timer\*(C'\fR callback invocation). |
|
|
1771 | .PP |
|
|
1772 | .Vb 2 |
|
|
1773 | \& static ev_stat passwd; |
|
|
1774 | \& static ev_timer timer; |
|
|
1775 | .Ve |
|
|
1776 | .PP |
|
|
1777 | .Vb 4 |
|
|
1778 | \& static void |
|
|
1779 | \& timer_cb (EV_P_ ev_timer *w, int revents) |
|
|
1780 | \& { |
|
|
1781 | \& ev_timer_stop (EV_A_ w); |
|
|
1782 | .Ve |
|
|
1783 | .PP |
|
|
1784 | .Vb 2 |
|
|
1785 | \& /* now it's one second after the most recent passwd change */ |
|
|
1786 | \& } |
|
|
1787 | .Ve |
|
|
1788 | .PP |
|
|
1789 | .Vb 6 |
|
|
1790 | \& static void |
|
|
1791 | \& stat_cb (EV_P_ ev_stat *w, int revents) |
|
|
1792 | \& { |
|
|
1793 | \& /* reset the one-second timer */ |
|
|
1794 | \& ev_timer_again (EV_A_ &timer); |
|
|
1795 | \& } |
|
|
1796 | .Ve |
|
|
1797 | .PP |
|
|
1798 | .Vb 4 |
|
|
1799 | \& ... |
|
|
1800 | \& ev_stat_init (&passwd, stat_cb, "/etc/passwd", 0.); |
|
|
1801 | \& ev_stat_start (loop, &passwd); |
|
|
1802 | \& ev_timer_init (&timer, timer_cb, 0., 1.01); |
1733 | .Ve |
1803 | .Ve |
1734 | .ie n .Sh """ev_idle"" \- when you've got nothing better to do..." |
1804 | .ie n .Sh """ev_idle"" \- when you've got nothing better to do..." |
1735 | .el .Sh "\f(CWev_idle\fP \- when you've got nothing better to do..." |
1805 | .el .Sh "\f(CWev_idle\fP \- when you've got nothing better to do..." |
1736 | .IX Subsection "ev_idle - when you've got nothing better to do..." |
1806 | .IX Subsection "ev_idle - when you've got nothing better to do..." |
1737 | Idle watchers trigger events when no other events of the same or higher |
1807 | Idle watchers trigger events when no other events of the same or higher |
… | |
… | |
2633 | interface to speed up \f(CW\*(C`ev_stat\*(C'\fR watchers. Its actual availability will |
2703 | interface to speed up \f(CW\*(C`ev_stat\*(C'\fR watchers. Its actual availability will |
2634 | be detected at runtime. |
2704 | be detected at runtime. |
2635 | .IP "\s-1EV_H\s0" 4 |
2705 | .IP "\s-1EV_H\s0" 4 |
2636 | .IX Item "EV_H" |
2706 | .IX Item "EV_H" |
2637 | The name of the \fIev.h\fR header file used to include it. The default if |
2707 | The name of the \fIev.h\fR header file used to include it. The default if |
2638 | undefined is \f(CW\*(C`<ev.h>\*(C'\fR in \fIevent.h\fR and \f(CW"ev.h"\fR in \fIev.c\fR. This |
2708 | undefined is \f(CW"ev.h"\fR in \fIevent.h\fR and \fIev.c\fR. This can be used to |
2639 | can be used to virtually rename the \fIev.h\fR header file in case of conflicts. |
2709 | virtually rename the \fIev.h\fR header file in case of conflicts. |
2640 | .IP "\s-1EV_CONFIG_H\s0" 4 |
2710 | .IP "\s-1EV_CONFIG_H\s0" 4 |
2641 | .IX Item "EV_CONFIG_H" |
2711 | .IX Item "EV_CONFIG_H" |
2642 | If \f(CW\*(C`EV_STANDALONE\*(C'\fR isn't \f(CW1\fR, this variable can be used to override |
2712 | If \f(CW\*(C`EV_STANDALONE\*(C'\fR isn't \f(CW1\fR, this variable can be used to override |
2643 | \&\fIev.c\fR's idea of where to find the \fIconfig.h\fR file, similarly to |
2713 | \&\fIev.c\fR's idea of where to find the \fIconfig.h\fR file, similarly to |
2644 | \&\f(CW\*(C`EV_H\*(C'\fR, above. |
2714 | \&\f(CW\*(C`EV_H\*(C'\fR, above. |
2645 | .IP "\s-1EV_EVENT_H\s0" 4 |
2715 | .IP "\s-1EV_EVENT_H\s0" 4 |
2646 | .IX Item "EV_EVENT_H" |
2716 | .IX Item "EV_EVENT_H" |
2647 | Similarly to \f(CW\*(C`EV_H\*(C'\fR, this macro can be used to override \fIevent.c\fR's idea |
2717 | Similarly to \f(CW\*(C`EV_H\*(C'\fR, this macro can be used to override \fIevent.c\fR's idea |
2648 | of how the \fIevent.h\fR header can be found. |
2718 | of how the \fIevent.h\fR header can be found, the dfeault is \f(CW"event.h"\fR. |
2649 | .IP "\s-1EV_PROTOTYPES\s0" 4 |
2719 | .IP "\s-1EV_PROTOTYPES\s0" 4 |
2650 | .IX Item "EV_PROTOTYPES" |
2720 | .IX Item "EV_PROTOTYPES" |
2651 | If defined to be \f(CW0\fR, then \fIev.h\fR will not define any function |
2721 | If defined to be \f(CW0\fR, then \fIev.h\fR will not define any function |
2652 | prototypes, but still define all the structs and other symbols. This is |
2722 | prototypes, but still define all the structs and other symbols. This is |
2653 | occasionally useful if you want to provide your own wrapper functions |
2723 | occasionally useful if you want to provide your own wrapper functions |
… | |
… | |
2710 | pid. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_MINIMAL\*(C'\fR), usually more |
2780 | pid. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_MINIMAL\*(C'\fR), usually more |
2711 | than enough. If you need to manage thousands of children you might want to |
2781 | than enough. If you need to manage thousands of children you might want to |
2712 | increase this value (\fImust\fR be a power of two). |
2782 | increase this value (\fImust\fR be a power of two). |
2713 | .IP "\s-1EV_INOTIFY_HASHSIZE\s0" 4 |
2783 | .IP "\s-1EV_INOTIFY_HASHSIZE\s0" 4 |
2714 | .IX Item "EV_INOTIFY_HASHSIZE" |
2784 | .IX Item "EV_INOTIFY_HASHSIZE" |
2715 | \&\f(CW\*(C`ev_staz\*(C'\fR watchers use a small hash table to distribute workload by |
2785 | \&\f(CW\*(C`ev_stat\*(C'\fR watchers use a small hash table to distribute workload by |
2716 | inotify watch id. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_MINIMAL\*(C'\fR), |
2786 | inotify watch id. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_MINIMAL\*(C'\fR), |
2717 | usually more than enough. If you need to manage thousands of \f(CW\*(C`ev_stat\*(C'\fR |
2787 | usually more than enough. If you need to manage thousands of \f(CW\*(C`ev_stat\*(C'\fR |
2718 | watchers you might want to increase this value (\fImust\fR be a power of |
2788 | watchers you might want to increase this value (\fImust\fR be a power of |
2719 | two). |
2789 | two). |
2720 | .IP "\s-1EV_COMMON\s0" 4 |
2790 | .IP "\s-1EV_COMMON\s0" 4 |
… | |
… | |
2824 | .RS 4 |
2894 | .RS 4 |
2825 | .IP "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" 4 |
2895 | .IP "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" 4 |
2826 | .IX Item "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" |
2896 | .IX Item "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" |
2827 | This means that, when you have a watcher that triggers in one hour and |
2897 | This means that, when you have a watcher that triggers in one hour and |
2828 | there are 100 watchers that would trigger before that then inserting will |
2898 | there are 100 watchers that would trigger before that then inserting will |
2829 | have to skip those 100 watchers. |
2899 | have to skip roughly seven (\f(CW\*(C`ld 100\*(C'\fR) of these watchers. |
2830 | .IP "Changing timer/periodic watchers (by autorepeat, again): O(log skipped_other_timers)" 4 |
2900 | .IP "Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)" 4 |
2831 | .IX Item "Changing timer/periodic watchers (by autorepeat, again): O(log skipped_other_timers)" |
2901 | .IX Item "Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)" |
2832 | That means that for changing a timer costs less than removing/adding them |
2902 | That means that changing a timer costs less than removing/adding them |
2833 | as only the relative motion in the event queue has to be paid for. |
2903 | as only the relative motion in the event queue has to be paid for. |
2834 | .IP "Starting io/check/prepare/idle/signal/child watchers: O(1)" 4 |
2904 | .IP "Starting io/check/prepare/idle/signal/child watchers: O(1)" 4 |
2835 | .IX Item "Starting io/check/prepare/idle/signal/child watchers: O(1)" |
2905 | .IX Item "Starting io/check/prepare/idle/signal/child watchers: O(1)" |
2836 | These just add the watcher into an array or at the head of a list. |
2906 | These just add the watcher into an array or at the head of a list. |
|
|
2907 | .IP "Stopping check/prepare/idle watchers: O(1)" 4 |
2837 | =item Stopping check/prepare/idle watchers: O(1) |
2908 | .IX Item "Stopping check/prepare/idle watchers: O(1)" |
|
|
2909 | .PD 0 |
2838 | .IP "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % \s-1EV_PID_HASHSIZE\s0))" 4 |
2910 | .IP "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % \s-1EV_PID_HASHSIZE\s0))" 4 |
2839 | .IX Item "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))" |
2911 | .IX Item "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))" |
|
|
2912 | .PD |
2840 | These watchers are stored in lists then need to be walked to find the |
2913 | These watchers are stored in lists then need to be walked to find the |
2841 | correct watcher to remove. The lists are usually short (you don't usually |
2914 | correct watcher to remove. The lists are usually short (you don't usually |
2842 | have many watchers waiting for the same fd or signal). |
2915 | have many watchers waiting for the same fd or signal). |
2843 | .IP "Finding the next timer per loop iteration: O(1)" 4 |
2916 | .IP "Finding the next timer in each loop iteration: O(1)" 4 |
2844 | .IX Item "Finding the next timer per loop iteration: O(1)" |
2917 | .IX Item "Finding the next timer in each loop iteration: O(1)" |
2845 | .PD 0 |
2918 | By virtue of using a binary heap, the next timer is always found at the |
|
|
2919 | beginning of the storage array. |
2846 | .IP "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" 4 |
2920 | .IP "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" 4 |
2847 | .IX Item "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" |
2921 | .IX Item "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" |
2848 | .PD |
|
|
2849 | A change means an I/O watcher gets started or stopped, which requires |
2922 | A change means an I/O watcher gets started or stopped, which requires |
2850 | libev to recalculate its status (and possibly tell the kernel). |
2923 | libev to recalculate its status (and possibly tell the kernel, depending |
2851 | .IP "Activating one watcher: O(1)" 4 |
2924 | on backend and wether \f(CW\*(C`ev_io_set\*(C'\fR was used). |
2852 | .IX Item "Activating one watcher: O(1)" |
2925 | .IP "Activating one watcher (putting it into the pending state): O(1)" 4 |
|
|
2926 | .IX Item "Activating one watcher (putting it into the pending state): O(1)" |
2853 | .PD 0 |
2927 | .PD 0 |
2854 | .IP "Priority handling: O(number_of_priorities)" 4 |
2928 | .IP "Priority handling: O(number_of_priorities)" 4 |
2855 | .IX Item "Priority handling: O(number_of_priorities)" |
2929 | .IX Item "Priority handling: O(number_of_priorities)" |
2856 | .PD |
2930 | .PD |
2857 | Priorities are implemented by allocating some space for each |
2931 | Priorities are implemented by allocating some space for each |
2858 | priority. When doing priority-based operations, libev usually has to |
2932 | priority. When doing priority-based operations, libev usually has to |
2859 | linearly search all the priorities. |
2933 | linearly search all the priorities, but starting/stopping and activating |
|
|
2934 | watchers becomes O(1) w.r.t. prioritiy handling. |
2860 | .RE |
2935 | .RE |
2861 | .RS 4 |
2936 | .RS 4 |
2862 | .SH "AUTHOR" |
2937 | .SH "AUTHOR" |
2863 | .IX Header "AUTHOR" |
2938 | .IX Header "AUTHOR" |
2864 | Marc Lehmann <libev@schmorp.de>. |
2939 | Marc Lehmann <libev@schmorp.de>. |