summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2012-04-11 21:33:27 -0400
committerNick Mathewson <nickm@torproject.org>2012-04-30 21:17:26 -0400
commitb3887cdf3b2ca715a1e496b7dcf2ee583e236338 (patch)
tree2fa30f4af280e6b3acaa26c7600c3bb7c6f19d71
parent4e62cd167b66f33e20344bff776253f19e2bc3e6 (diff)
downloadlibevent-b3887cdf3b2ca715a1e496b7dcf2ee583e236338.tar.gz
Work-around a stupid gcov-breaking bug in OSX 10.6
This only affects the unit tests. Fix found at http://rachelbythebay.com/w/2011/07/12/forkcrash/ (Backport from 2.1)
-rw-r--r--test/regress.c2
-rw-r--r--test/regress.h2
-rw-r--r--test/regress_main.c20
-rw-r--r--test/regress_util.c2
-rw-r--r--test/tinytest.c12
5 files changed, 36 insertions, 2 deletions
diff --git a/test/regress.c b/test/regress.c
index 3d97d0b2..90f4549c 100644
--- a/test/regress.c
+++ b/test/regress.c
@@ -851,7 +851,7 @@ test_fork(void)
event_base_assert_ok(current_base);
TT_BLATHER(("Before fork"));
- if ((pid = fork()) == 0) {
+ if ((pid = regress_fork()) == 0) {
/* in the child */
TT_BLATHER(("In child, before reinit"));
event_base_assert_ok(current_base);
diff --git a/test/regress.h b/test/regress.h
index 32adccdf..afcc35fc 100644
--- a/test/regress.h
+++ b/test/regress.h
@@ -118,6 +118,8 @@ int _test_ai_eq(const struct evutil_addrinfo *ai, const char *sockaddr_port,
long timeval_msec_diff(const struct timeval *start, const struct timeval *end);
+pid_t regress_fork(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/test/regress_main.c b/test/regress_main.c
index 42a0366a..32557c1e 100644
--- a/test/regress_main.c
+++ b/test/regress_main.c
@@ -32,6 +32,14 @@
#include <fcntl.h>
#endif
+#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
+#if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 && \
+ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
+#define FORK_BREAKS_GCOV
+#include <vproc.h>
+#endif
+#endif
+
#include "event2/event-config.h"
#ifdef _EVENT___func__
@@ -154,6 +162,18 @@ regress_make_tmpfile(const void *data, size_t datalen)
#endif
}
+#ifndef _WIN32
+pid_t
+regress_fork(void)
+{
+ pid_t pid = fork();
+#ifdef FORK_BREAKS_GCOV
+ vproc_transaction_begin(0);
+#endif
+ return pid;
+}
+#endif
+
static void
ignore_log_cb(int s, const char *msg)
{
diff --git a/test/regress_util.c b/test/regress_util.c
index 88d80577..71830a6f 100644
--- a/test/regress_util.c
+++ b/test/regress_util.c
@@ -469,7 +469,7 @@ check_error_logging(void (*fn)(void), int wantexitcode,
int status = 0, exitcode;
fatal_want_severity = wantseverity;
fatal_want_message = wantmsg;
- if ((pid = fork()) == 0) {
+ if ((pid = regress_fork()) == 0) {
/* child process */
fn();
exit(0); /* should be unreachable. */
diff --git a/test/tinytest.c b/test/tinytest.c
index 91cd8cb1..065bd623 100644
--- a/test/tinytest.c
+++ b/test/tinytest.c
@@ -40,6 +40,15 @@
#include <unistd.h>
#endif
+#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
+#if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 && \
+ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
+/* Workaround for a stupid bug in OSX 10.6 */
+#define FORK_BREAKS_GCOV
+#include <vproc.h>
+#endif
+#endif
+
#ifndef __GNUC__
#define __attribute__(x)
#endif
@@ -161,6 +170,9 @@ _testcase_run_forked(const struct testgroup_t *group,
if (opt_verbosity>0)
printf("[forking] ");
pid = fork();
+#ifdef FORK_BREAKS_GCOV
+ vproc_transaction_begin(0);
+#endif
if (!pid) {
/* child. */
int test_r, write_r;