diff options
author | Luke Dashjr <luke-jr+git@utopios.org> | 2013-12-24 23:10:42 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2013-12-25 00:28:28 +0100 |
commit | e8b57d1e849c80652b762130f38beeb0d431b23f (patch) | |
tree | c8038cea99acbf6be8a26b077cc4e22b8e1eb1b0 | |
parent | 7fd490732acdccc2c0f490a31a3828fa7a284f63 (diff) |
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
-rw-r--r-- | lib/curl_threads.c | 28 | ||||
-rw-r--r-- | 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, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, 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) |