From ead52e0bdcf72d03a51b6f092607591a51fcdb20 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 3 Jan 2005 18:06:51 +0000 Subject: [PATCH] Possible fix for task #43: when running on a multithreaded environment (currently only windows), threads should not close opposite sides of their socketpairs, and workers should not call connection_free_all(). This may fix win32 servers. svn:r3247 --- src/common/compat.h | 6 ++++++ src/or/cpuworker.c | 4 +++- src/or/dns.c | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/common/compat.h b/src/common/compat.h index dafd1339a5..d9cb5669d6 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -191,5 +191,11 @@ void tor_mutex_acquire(tor_mutex_t *m); void tor_mutex_release(tor_mutex_t *m); void tor_mutex_free(tor_mutex_t *m); +#ifdef MS_WINDOWS +#define TOR_IS_MULTITHREADED 1 +#else +#undef TOR_IS_MULTITHREADED +#endif + #endif diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c index b1fef2660b..c9ac3ebee4 100644 --- a/src/or/cpuworker.c +++ b/src/or/cpuworker.c @@ -210,7 +210,7 @@ static int cpuworker_main(void *data) { crypto_pk_env_t *onion_key = NULL, *last_onion_key = NULL; fd = fdarray[1]; /* this side is ours */ -#ifndef MS_WINDOWS +#ifndef TOR_IS_MULTITHREADED tor_close_socket(fdarray[0]); /* this is the side of the socketpair the parent uses */ connection_free_all(); /* so the child doesn't hold the parent's fd's open */ #endif @@ -282,7 +282,9 @@ static int spawn_cpuworker(void) { spawn_func(cpuworker_main, (void*)fd); log_fn(LOG_DEBUG,"just spawned a worker."); +#ifndef TOR_IS_MULTITHREADED tor_close_socket(fd[1]); /* we don't need the worker's side of the pipe */ +#endif conn = connection_new(CONN_TYPE_CPUWORKER); diff --git a/src/or/dns.c b/src/or/dns.c index 57871bf23f..afc777dd7e 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -654,7 +654,7 @@ static int dnsworker_main(void *data) { int result; fd = fdarray[1]; /* this side is ours */ -#ifndef MS_WINDOWS +#ifndef TOR_IS_MULTITHREADED tor_close_socket(fdarray[0]); /* this is the side of the socketpair the parent uses */ connection_free_all(); /* so the child doesn't hold the parent's fd's open */ #endif @@ -716,7 +716,9 @@ static int spawn_dnsworker(void) { spawn_func(dnsworker_main, (void*)fd); log_fn(LOG_DEBUG,"just spawned a worker."); +#ifndef TOR_IS_MULTITHREADED tor_close_socket(fd[1]); /* we don't need the worker's side of the pipe */ +#endif conn = connection_new(CONN_TYPE_DNSWORKER);