diff options
author | Nick Mathewson <nickm@torproject.org> | 2014-05-01 12:13:07 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2014-05-01 12:13:07 -0400 |
commit | b6c8a14bf35c4572fba49be9eb4aaaa78d776c4c (patch) | |
tree | 452e9c230c71131d20422d519ac05c95dd688c77 /src/common | |
parent | 1bbd3811c1c98e6a630ab96f15a376910a576626 (diff) | |
parent | 1ebdaf5788cb7969ee3f853ede4e6e3364343fc0 (diff) | |
download | tor-b6c8a14bf35c4572fba49be9eb4aaaa78d776c4c.tar tor-b6c8a14bf35c4572fba49be9eb4aaaa78d776c4c.tar.gz |
Merge remote-tracking branch 'public/bug4345a_024'
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/compat.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/common/compat.c b/src/common/compat.c index 1ba264a0c..974f697e3 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -2429,6 +2429,12 @@ tor_pthread_helper_fn(void *_data) func(arg); return NULL; } +/** + * A pthread attribute to make threads start detached. + */ +static pthread_attr_t attr_detached; +/** True iff we've called tor_threads_init() */ +static int threads_initialized = 0; #endif /** Minimalist interface to run a void function in the background. On @@ -2452,12 +2458,12 @@ spawn_func(void (*func)(void *), void *data) #elif defined(USE_PTHREADS) pthread_t thread; tor_pthread_data_t *d; + if (PREDICT_UNLIKELY(!threads_initialized)) + tor_threads_init(); d = tor_malloc(sizeof(tor_pthread_data_t)); d->data = data; d->func = func; - if (pthread_create(&thread,NULL,tor_pthread_helper_fn,d)) - return -1; - if (pthread_detach(thread)) + if (pthread_create(&thread,&attr_detached,tor_pthread_helper_fn,d)) return -1; return 0; #else @@ -2814,8 +2820,6 @@ tor_get_thread_id(void) * "reentrant" mutexes (i.e., once we can re-lock if we're already holding * them.) */ static pthread_mutexattr_t attr_reentrant; -/** True iff we've called tor_threads_init() */ -static int threads_initialized = 0; /** Initialize <b>mutex</b> so it can be locked. Every mutex must be set * up with tor_mutex_init() or tor_mutex_new(); not both. */ void @@ -2959,6 +2963,8 @@ tor_threads_init(void) if (!threads_initialized) { pthread_mutexattr_init(&attr_reentrant); pthread_mutexattr_settype(&attr_reentrant, PTHREAD_MUTEX_RECURSIVE); + tor_assert(0==pthread_attr_init(&attr_detached)); + tor_assert(0==pthread_attr_setdetachstate(&attr_detached, 1)); threads_initialized = 1; set_main_thread(); } |