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)
This commit is contained in:
Nick Mathewson 2012-04-11 21:33:27 -04:00
parent 4e62cd167b
commit b3887cdf3b
5 changed files with 36 additions and 2 deletions

View File

@ -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);

View File

@ -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

View File

@ -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)
{

View File

@ -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. */

View File

@ -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;