diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-12-16 13:35:09 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-12-16 13:37:43 -0500 |
commit | dd2ae32bc181efdc134c25359bc67d073c48a1d0 (patch) | |
tree | 57e25a1ea08e0ece5ed914918838091215bca053 /src/common/compat_libevent.c | |
parent | 1d0f8fe53c07f8015a411564d741fcd56a4e1eca (diff) | |
download | tor-dd2ae32bc181efdc134c25359bc67d073c48a1d0.tar.gz tor-dd2ae32bc181efdc134c25359bc67d073c48a1d0.zip |
Turn on epoll changelists with libevent 2.0.9-rc and later
Libevent 2.0 has a "changelist" feature that avoids making redundant
syscalls if we wind up doing a lot of event_add/event_del operations
on the same fd in a row. Unfortunately, due to a weird design
choice in Linux, it doesn't work right with epoll when multiple fds
refer to the same socket (e.g., one is a dup() of the other). We
don't dup() anything we give to Libevent, though, so it is safe for
us to explicitly turn this feature on.
Diffstat (limited to 'src/common/compat_libevent.c')
-rw-r--r-- | src/common/compat_libevent.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c index d3b9eb3afa..7bbad54415 100644 --- a/src/common/compat_libevent.c +++ b/src/common/compat_libevent.c @@ -186,6 +186,12 @@ tor_libevent_initialize(tor_libevent_cfg *torcfg) event_config_set_num_cpus_hint(cfg, torcfg->num_cpus); #endif +#if LIBEVENT_VERSION_NUMBER >= V(2,0,9) + /* We can enable changelist support with epoll, since we don't give + * Libevent any dup'd fds. This lets us avoid some syscalls. */ + event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST); +#endif + the_event_base = event_base_new_with_config(cfg); event_config_free(cfg); |