Commit e8b57d1e authored by Luke Dashjr's avatar Luke Dashjr Committed by Daniel Stenberg
Browse files

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
parent 7fd49073
Loading
Loading
Loading
Loading
+17 −11
Original line number Diff line number Diff line
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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)