summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 0b68650c..4a82e449 100644
--- a/test/regress.c
+++ b/test/regress.c
@@ -829,7 +829,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 9c18569c..fed5150f 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 96b5b7ee..05e28433 100644
--- a/test/regress_main.c
+++ b/test/regress_main.c
@@ -33,6 +33,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__
@@ -157,6 +165,18 @@ regress_make_tmpfile(const void *data, size_t datalen, char **filename_out)
#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 6aaeeacf..33053291 100644
--- a/test/regress_util.c
+++ b/test/regress_util.c
@@ -471,7 +471,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 4d9afacc..644ea926 100644
--- a/test/tinytest.c
+++ b/test/tinytest.c
@@ -39,6 +39,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
@@ -160,6 +169,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;