[tor-commits] [stegotorus/master] Disable use of kqueue by default.

zwol at torproject.org zwol at torproject.org
Fri Jul 20 23:17:07 UTC 2012


commit 703e2d3af156de39c61e4b1b901fade17623758f
Author: Zack Weinberg <zackw at cmu.edu>
Date:   Wed Feb 29 15:52:23 2012 -0800

    Disable use of kqueue by default.
---
 src/main.cc |   51 +++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/src/main.cc b/src/main.cc
index d7f3d87..db338af 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -33,6 +33,7 @@ using std::vector;
 using std::string;
 
 static struct event_base *the_event_base;
+static bool allow_kq = false;
 
 /**
    Puts stegotorus's networking subsystem on "closing time" mode. This
@@ -174,7 +175,8 @@ usage(void)
   fprintf(stderr, "\n* Available arguments:\n"
           "--log-file=<file> ~ set logfile\n"
           "--log-min-severity=warn|info|debug ~ set minimum logging severity\n"
-          "--no-log ~ disable logging\n");
+          "--no-log ~ disable logging\n"
+          "--allow-kqueue ~ allow use of kqueue(2) (may be buggy)\n");
 
   exit(1);
 }
@@ -190,9 +192,10 @@ usage(void)
 static int
 handle_generic_args(const char *const *argv)
 {
-  int logmethod_set=0;
-  int logsev_set=0;
-  int i=1;
+  bool logmethod_set = false;
+  bool logsev_set = false;
+  bool allow_kq_set = false;
+  int i = 1;
 
   while (argv[i] &&
          !strncmp(argv[i],"--",2)) {
@@ -216,8 +219,8 @@ handle_generic_args(const char *const *argv)
         log_warn("error at setting logging severity");
         exit(1);
       }
-      logsev_set=1;
-    } else if (!strncmp(argv[i], "--no-log", 9)) {
+      logsev_set = true;
+    } else if (!strcmp(argv[i], "--no-log")) {
         if (logsev_set) {
           fprintf(stderr, "you've already set a min. log severity!\n");
           exit(1);
@@ -226,7 +229,14 @@ handle_generic_args(const char *const *argv)
           fprintf(stderr, "error at setting logging severity.\n");
           exit(1);
         }
-        logsev_set=1;
+        logsev_set = true;
+    } else if (!strcmp(argv[i], "--allow-kqueue")) {
+      if (allow_kq_set) {
+        fprintf(stderr, "you've already allowed kqueue!\n");
+        exit(1);
+      }
+      allow_kq = true;
+      allow_kq_set = true;
     } else {
       log_warn("unrecognizable argument '%s'", argv[i]);
       exit(1);
@@ -240,6 +250,7 @@ handle_generic_args(const char *const *argv)
 int
 main(int, const char *const *argv)
 {
+  struct event_config *evcfg;
   struct event *sig_int;
   struct event *sig_term;
   struct event *stdin_eof;
@@ -302,10 +313,26 @@ main(int, const char *const *argv)
   }
 #endif
 
-  /* Initialize libevent */
-  the_event_base = event_base_new();
+  /* Configure and initialize libevent. */
+  evcfg = event_config_new();
+  if (!evcfg)
+    log_abort("failed to initialize networking (evcfg)");
+
+  /* The main reason we bother with an event_config object is that
+     nobody's had time to track down the bugs that only the kqueue
+     backend exposes and figure out whose fault they are. There is
+     a command line switch waiting for the person who will do this
+     detective work. */
+  if (!allow_kq)
+    if (event_config_avoid_method(evcfg, "kqueue"))
+      log_abort("failed to initialize networking (avoiding kqueue)");
+
+  /* Possibly worth doing in the future: activating Windows IOCP and
+     telling it how many CPUs to use. */
+
+  the_event_base = event_base_new_with_config(evcfg);
   if (!the_event_base)
-    log_abort("failed to initialize networking");
+    log_abort("failed to initialize networking (evbase)");
 
   /* ASN should this happen only when SOCKS is enabled? */
   if (init_evdns_base(the_event_base))
@@ -319,7 +346,7 @@ main(int, const char *const *argv)
                          handle_signal_cb, NULL);
   sig_term = evsignal_new(the_event_base, SIGTERM,
                           handle_signal_cb, NULL);
-  if (event_add(sig_int,NULL) || event_add(sig_term,NULL))
+  if (event_add(sig_int, NULL) || event_add(sig_term, NULL))
     log_abort("failed to initialize signal handling");
 
 #ifndef _WIN32
@@ -391,7 +418,7 @@ main(int, const char *const *argv)
   event_free(sig_term);
   free(stdin_eof);
   event_base_free(the_event_base);
-
+  event_config_free(evcfg);
   log_close();
 
   return 0;





More information about the tor-commits mailing list