summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-05-24 17:23:10 +0000
committerNick Mathewson <nickm@torproject.org>2007-05-24 17:23:10 +0000
commita6d2f877f516c9747282e5716d5e774b0bc06d19 (patch)
treeadca81f9db30b5cdcb44e9ab85ec52ed9f72c12f
parent5dcac14bab7d74745cb0b5bfd9ea31f661c820e6 (diff)
downloadtor-a6d2f877f516c9747282e5716d5e774b0bc06d19.tar.gz
tor-a6d2f877f516c9747282e5716d5e774b0bc06d19.zip
r12928@catbus: nickm | 2007-05-24 13:23:07 -0400
Backport 10307: Warn when using a version of libevent before 1.3b to run a server on osx or bsd: these versions of libevent interact badly with userspace threads. svn:r10309
-rw-r--r--ChangeLog2
-rw-r--r--src/or/config.c30
2 files changed, 26 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 081cf8cc1d..94f8465d3b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -41,6 +41,8 @@ Changes in version 0.1.2.14 - 2007-05-23
- When routers publish SVN revisions in their router descriptors,
authorities now include those versions correctly in networkstatus
documents.
+ - Warn when using a version of libevent before 1.3b to run a server on
+ OSX or BSD: these versions interact badly with userspace threads.
Changes in version 0.1.2.13 - 2007-04-24
diff --git a/src/or/config.c b/src/or/config.c
index f8d97eecc4..83fa0048c1 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -584,7 +584,7 @@ typedef enum {
/* Note: we compare these, so it's important that "old" precede everything,
* and that "other" come last. */
LE_OLD=0, LE_10C, LE_10D, LE_10E, LE_11, LE_11A, LE_11B, LE_12, LE_12A,
- LE_13, LE_13A,
+ LE_13, LE_13A, LE_13B,
LE_OTHER
} le_version_t;
static le_version_t decode_libevent_version(void);
@@ -3832,6 +3832,7 @@ static const struct {
{ "1.2a", LE_12A },
{ "1.3", LE_13 },
{ "1.3a", LE_13A },
+ { "1.3b", LE_13B },
{ NULL, LE_OTHER }
};
@@ -3858,10 +3859,11 @@ decode_libevent_version(void)
static void
check_libevent_version(const char *m, int server)
{
- int buggy = 0, iffy = 0, slow = 0;
+ int buggy = 0, iffy = 0, slow = 0, thread_unsafe = 0;
le_version_t version;
const char *v = event_get_version();
const char *badness = NULL;
+ const char *sad_os = "";
version = decode_libevent_version();
@@ -3894,7 +3896,26 @@ check_libevent_version(const char *m, int server)
buggy = 1;
}
- if (buggy) {
+ /* Libevent versions before 1.3b do very badly on operating systems with
+ * user-space threading implementations. */
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+ if (server && version < LE_13B) {
+ thread_unsafe = 1;
+ sad_os = "BSD variants"
+ }
+#elif defined(__APPLE__) || defined(__darwin__)
+ if (server && version < LE_13B) {
+ thread_unsafe = 1;
+ sad_os = "Mac OS X";
+ }
+#endif
+
+ if (thread_unsafe) {
+ log(LOG_WARN, LD_GENERAL,
+ "Libevent version %s often crashes when running a Tor server with %s. "
+ "Please use the latest version of libevent (1.3b or later)",v,sad_os);
+ badness = "BROKEN";
+ } else if (buggy) {
log(LOG_WARN, LD_GENERAL,
"There are known bugs in using %s with libevent %s. "
"Please use the latest version of libevent.", m, v);
@@ -3911,9 +3932,6 @@ check_libevent_version(const char *m, int server)
v,m);
badness = "SLOW";
}
- /* XXXX012 if libevent 1.3b comes out before 0.1.2.x, and it works,
- * recomment an upgrade to everybody on BSD or OSX or anywhere with
- * that flavor of pthreads. */
if (badness) {
control_event_general_status(LOG_WARN,
"BAD_LIBEVENT VERSION=%s METHOD=%s BADNESS=%s RECOVERED=NO",