Browse Source

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.
Nick Mathewson 13 years ago
parent
commit
dd2ae32bc1
1 changed files with 6 additions and 0 deletions
  1. 6 0
      src/common/compat_libevent.c

+ 6 - 0
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);