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 /lib/curl_threads.c | |
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
Diffstat (limited to 'lib/curl_threads.c')
-rw-r--r-- | lib/curl_threads.c | 28 |
1 files changed, 17 insertions, 11 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; |