return;
Curl_mutex_acquire(&addr_ctx->mutx);
+ if(!data) /* called by resolving thread */
+ addr_ctx->thrd_done = TRUE;
+
DEBUGASSERT(addr_ctx->ref_count);
--addr_ctx->ref_count;
- destroy = !addr_ctx->ref_count; /* was the last one */
+ destroy = (!addr_ctx->ref_count && addr_ctx->thrd_done);
#ifndef CURL_DISABLE_SOCKETPAIR
if(!destroy) {
Curl_mutex_release(&addr_ctx->mutx);
if(destroy) {
-#ifdef USE_CURL_COND_T
- Curl_cond_destroy(&addr_ctx->cond);
-#endif
Curl_mutex_destroy(&addr_ctx->mutx);
free(addr_ctx->hostname);
if(addr_ctx->res)
#endif
Curl_mutex_init(&addr_ctx->mutx);
-#ifdef USE_CURL_COND_T
- Curl_cond_init(&addr_ctx->cond);
-#endif
#ifndef CURL_DISABLE_SOCKETPAIR
/* create socket pair or pipe */
{
Curl_thread_disable_cancel();
Curl_mutex_acquire(&addr_ctx->mutx);
- DEBUGASSERT(addr_ctx->ref_count);
++addr_ctx->ref_count;
-#ifdef USE_CURL_COND_T
- Curl_cond_signal(&addr_ctx->cond);
-#endif
Curl_mutex_release(&addr_ctx->mutx);
-
return TRUE;
}
#endif
if(thrdd->addr && (thrdd->addr->thread_hnd != curl_thread_t_null)) {
- bool done = TRUE;
+ bool done;
Curl_mutex_acquire(&addr->mutx);
- done = (addr->ref_count <= 1);
+ done = addr->thrd_done;
Curl_mutex_release(&addr->mutx);
if(done) {
Curl_thread_join(&addr->thread_hnd);
if(addr_ctx->thread_hnd == curl_thread_t_null) {
/* The thread never started */
+ addr_ctx->thrd_done = TRUE;
Curl_mutex_release(&addr_ctx->mutx);
err = errno;
goto err_exit;
}
- else {
-#ifdef USE_CURL_COND_T
- /* need to handshake with thread for participation in ref counting */
- Curl_cond_wait(&addr_ctx->cond, &addr_ctx->mutx);
- DEBUGASSERT(addr_ctx->ref_count >= 1);
-#endif
- Curl_mutex_release(&addr_ctx->mutx);
- }
+ Curl_mutex_release(&addr_ctx->mutx);
#ifdef USE_HTTPSRR_ARES
if(async_rr_start(data))
return;
Curl_mutex_acquire(&addr_ctx->mutx);
- done = (addr_ctx->ref_count <= 1);
+ done = addr_ctx->thrd_done;
/* We are no longer interested in wakeups */
if(addr_ctx->sock_pair[1] != CURL_SOCKET_BAD) {
wakeup_close(addr_ctx->sock_pair[1]);
#ifdef DEBUGBUILD
Curl_mutex_acquire(&addr_ctx->mutx);
DEBUGASSERT(addr_ctx->ref_count == 1);
+ DEBUGASSERT(addr_ctx->thrd_done);
Curl_mutex_release(&addr_ctx->mutx);
#endif
if(entry)
return CURLE_FAILED_INIT;
Curl_mutex_acquire(&thrdd->addr->mutx);
- done = (thrdd->addr->ref_count == 1);
+ done = thrdd->addr->thrd_done;
Curl_mutex_release(&thrdd->addr->mutx);
if(done) {
# define Curl_mutex_acquire(m) pthread_mutex_lock(m)
# define Curl_mutex_release(m) pthread_mutex_unlock(m)
# define Curl_mutex_destroy(m) pthread_mutex_destroy(m)
-# define USE_CURL_COND_T
-# define curl_cond_t pthread_cond_t
-# define Curl_cond_init(c) pthread_cond_init(c, NULL)
-# define Curl_cond_destroy(c) pthread_cond_destroy(c)
-# define Curl_cond_wait(c, m) pthread_cond_wait(c, m)
-# define Curl_cond_signal(c) pthread_cond_signal(c)
#elif defined(USE_THREADS_WIN32)
# define CURL_STDCALL __stdcall
# define curl_mutex_t CRITICAL_SECTION
# define Curl_mutex_acquire(m) EnterCriticalSection(m)
# define Curl_mutex_release(m) LeaveCriticalSection(m)
# define Curl_mutex_destroy(m) DeleteCriticalSection(m)
-# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
-# define USE_CURL_COND_T
-# define curl_cond_t CONDITION_VARIABLE
-# define Curl_cond_init(c) InitializeConditionVariable(c)
-# define Curl_cond_destroy(c) (void)(c)
-# define Curl_cond_wait(c, m) SleepConditionVariableCS(c, m, INFINITE)
-# define Curl_cond_signal(c) WakeConditionVariable(c)
-# endif
#else
# define CURL_STDCALL
#endif