Kaynağa Gözat

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 15 yıl önce
ebeveyn
işleme
dd2ae32bc1
1 değiştirilmiş dosya ile 6 ekleme ve 0 silme
  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);