From e8b57d1e849c80652b762130f38beeb0d431b23f Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Tue, 24 Dec 2013 23:10:42 +0000 Subject: [PATCH] threaded resolver: Use pthread_t * for curl_thread_t ... since pthread_t may be non-scalar and/or may represent a real thread with scalar 0. Bug: http://curl.haxx.se/bug/view.cgi?id=1314 --- lib/curl_threads.c | 28 +++++++++++++++++----------- lib/curl_threads.h | 4 ++-- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/lib/curl_threads.c b/lib/curl_threads.c index c9e91f63a..97527807e 100644 --- a/lib/curl_threads.c +++ b/lib/curl_threads.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -63,32 +63,38 @@ static void *curl_thread_create_thunk(void *arg) curl_thread_t Curl_thread_create(unsigned int (*func) (void*), void *arg) { - curl_thread_t t; + curl_thread_t t = malloc(sizeof(pthread_t)); struct curl_actual_call *ac = malloc(sizeof(struct curl_actual_call)); - if(!ac) - return curl_thread_t_null; + if(!(ac && t)) + goto err; ac->func = func; ac->arg = arg; - if(pthread_create(&t, NULL, curl_thread_create_thunk, ac) != 0) { - free(ac); - return curl_thread_t_null; - } + if(pthread_create(t, NULL, curl_thread_create_thunk, ac) != 0) + goto err; return t; + +err: + free(t); + free(ac); + return curl_thread_t_null; } void Curl_thread_destroy(curl_thread_t hnd) { - if(hnd != curl_thread_t_null) - pthread_detach(hnd); + if(hnd != curl_thread_t_null) { + pthread_detach(*hnd); + free(hnd); + } } int Curl_thread_join(curl_thread_t *hnd) { - int ret = (pthread_join(*hnd, NULL) == 0); + int ret = (pthread_join(**hnd, NULL) == 0); + free(*hnd); *hnd = curl_thread_t_null; return ret; diff --git a/lib/curl_threads.h b/lib/curl_threads.h index d9cec6b29..6457cbb19 100644 --- a/lib/curl_threads.h +++ b/lib/curl_threads.h @@ -26,8 +26,8 @@ #if defined(USE_THREADS_POSIX) # define CURL_STDCALL # define curl_mutex_t pthread_mutex_t -# define curl_thread_t pthread_t -# define curl_thread_t_null (pthread_t)0 +# define curl_thread_t pthread_t * +# define curl_thread_t_null (pthread_t *)0 # define Curl_mutex_init(m) pthread_mutex_init(m, NULL) # define Curl_mutex_acquire(m) pthread_mutex_lock(m) # define Curl_mutex_release(m) pthread_mutex_unlock(m)