Pārlūkot izejas kodu

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 gadi atpakaļ
vecāks
revīzija
dd2ae32bc1
1 mainītis faili ar 6 papildinājumiem un 0 dzēšanām
  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);