#include "curl_threads.h"
#include "select.h"
#include "strdup.h"
-#include "curlx/wait.h"
#ifdef USE_ARES
#include <ares.h>
DEBUGASSERT(addr_ctx->ref_count);
--addr_ctx->ref_count;
- destroy = (!addr_ctx->ref_count && addr_ctx->thrd_done);
-
-#ifndef CURL_DISABLE_SOCKETPAIR
- if(!destroy) {
- if(!data) { /* Called from thread, transfer still waiting on results. */
- if(addr_ctx->sock_pair[1] != CURL_SOCKET_BAD) {
-#ifdef USE_EVENTFD
- const uint64_t buf[1] = { 1 };
-#else
- const char buf[1] = { 1 };
-#endif
- /* Thread is done, notify transfer */
- if(wakeup_write(addr_ctx->sock_pair[1], buf, sizeof(buf)) < 0) {
- /* update sock_error to errno */
- addr_ctx->sock_error = SOCKERRNO;
- }
- }
- }
- else { /* transfer going away, thread still running */
-#ifndef USE_EVENTFD
- if(addr_ctx->sock_pair[1] != CURL_SOCKET_BAD) {
- wakeup_close(addr_ctx->sock_pair[1]);
- addr_ctx->sock_pair[1] = CURL_SOCKET_BAD;
- }
-#endif
- /* Remove socket from event monitoring */
- if(addr_ctx->sock_pair[0] != CURL_SOCKET_BAD) {
- Curl_multi_will_close(data, addr_ctx->sock_pair[0]);
- wakeup_close(addr_ctx->sock_pair[0]);
- addr_ctx->sock_pair[0] = CURL_SOCKET_BAD;
- }
- }
- }
-#endif
-
+ destroy = !addr_ctx->ref_count;
Curl_mutex_release(&addr_ctx->mutx);
if(destroy) {
free(addr_ctx->hostname);
if(addr_ctx->res)
Curl_freeaddrinfo(addr_ctx->res);
+#ifndef CURL_DISABLE_SOCKETPAIR
+#ifndef USE_EVENTFD
+ wakeup_close(addr_ctx->sock_pair[1]);
+#endif
+ wakeup_close(addr_ctx->sock_pair[0]);
+#endif
free(addr_ctx);
}
*paddr_ctx = NULL;
addr_ctx->thread_hnd = curl_thread_t_null;
addr_ctx->port = port;
-#ifndef CURL_DISABLE_SOCKETPAIR
- addr_ctx->sock_pair[0] = CURL_SOCKET_BAD;
- addr_ctx->sock_pair[1] = CURL_SOCKET_BAD;
-#endif
addr_ctx->ref_count = 1;
#ifdef HAVE_GETADDRINFO
#pragma clang diagnostic ignored "-Wextra-semi-stmt"
#endif
- Curl_thread_cancel_deferred();
Curl_thread_push_cleanup(async_thrd_cleanup, addr_ctx);
- Curl_thread_disable_cancel();
Curl_mutex_acquire(&addr_ctx->mutx);
do_abort = addr_ctx->do_abort;
char service[12];
int rc;
- Curl_thread_enable_cancel();
#ifdef DEBUGBUILD
Curl_resolve_test_delay();
#endif
else {
Curl_addrinfo_set_port(addr_ctx->res, addr_ctx->port);
}
+
+ Curl_mutex_acquire(&addr_ctx->mutx);
+ do_abort = addr_ctx->do_abort;
+ Curl_mutex_release(&addr_ctx->mutx);
+#ifndef CURL_DISABLE_SOCKETPAIR
+ if(!do_abort) {
+#ifdef USE_EVENTFD
+ const uint64_t buf[1] = { 1 };
+#else
+ const char buf[1] = { 1 };
+#endif
+ /* Thread is done, notify transfer */
+ if(wakeup_write(addr_ctx->sock_pair[1], buf, sizeof(buf)) < 0) {
+ /* update sock_error to errno */
+ addr_ctx->sock_error = SOCKERRNO;
+ }
+ }
+#endif
+
}
- Curl_thread_disable_cancel();
Curl_thread_pop_cleanup();
#if defined(__clang__)
#pragma clang diagnostic pop
#pragma clang diagnostic ignored "-Wextra-semi-stmt"
#endif
- Curl_thread_cancel_deferred();
Curl_thread_push_cleanup(async_thrd_cleanup, addr_ctx);
- Curl_thread_disable_cancel();
Curl_mutex_acquire(&addr_ctx->mutx);
do_abort = addr_ctx->do_abort;
Curl_mutex_release(&addr_ctx->mutx);
- if(!do_abort) {
- Curl_thread_enable_cancel();
+ if(!do_abort) {
#ifdef DEBUGBUILD
Curl_resolve_test_delay();
#endif
if(addr_ctx->sock_error == 0)
addr_ctx->sock_error = RESOLVER_ENOMEM;
}
+
+ Curl_mutex_acquire(&addr_ctx->mutx);
+ do_abort = addr_ctx->do_abort;
+ Curl_mutex_release(&addr_ctx->mutx);
+#ifndef CURL_DISABLE_SOCKETPAIR
+ if(!do_abort) {
+#ifdef USE_EVENTFD
+ const uint64_t buf[1] = { 1 };
+#else
+ const char buf[1] = { 1 };
+#endif
+ /* Thread is done, notify transfer */
+ if(wakeup_write(addr_ctx->sock_pair[1], buf, sizeof(buf)) < 0) {
+ /* update sock_error to errno */
+ addr_ctx->sock_error = SOCKERRNO;
+ }
+ }
+#endif
}
- Curl_thread_disable_cancel();
Curl_thread_pop_cleanup();
#if defined(__clang__)
#pragma clang diagnostic pop
bool done;
Curl_mutex_acquire(&addr->mutx);
+#ifndef CURL_DISABLE_SOCKETPAIR
+ if(!addr->do_abort)
+ Curl_multi_will_close(data, addr->sock_pair[0]);
+#endif
+ addr->do_abort = TRUE;
done = addr->thrd_done;
Curl_mutex_release(&addr->mutx);
+
if(done) {
Curl_thread_join(&addr->thread_hnd);
CURL_TRC_DNS(data, "async_thrdd_destroy, thread joined");
return;
Curl_mutex_acquire(&addr_ctx->mutx);
- addr_ctx->do_abort = TRUE;
- done = addr_ctx->thrd_done;
#ifndef CURL_DISABLE_SOCKETPAIR
- /* We are no longer interested in wakeups */
- if(addr_ctx->sock_pair[1] != CURL_SOCKET_BAD) {
- wakeup_close(addr_ctx->sock_pair[1]);
- addr_ctx->sock_pair[1] = CURL_SOCKET_BAD;
- }
+ if(!addr_ctx->do_abort)
+ Curl_multi_will_close(data, addr_ctx->sock_pair[0]);
#endif
+ addr_ctx->do_abort = TRUE;
+ done = addr_ctx->thrd_done;
Curl_mutex_release(&addr_ctx->mutx);
DEBUGASSERT(addr_ctx->thread_hnd != curl_thread_t_null);
if(!done && (addr_ctx->thread_hnd != curl_thread_t_null)) {
- timediff_t alive_ms = curlx_timediff(curlx_now(), addr_ctx->start);
- /* give thread a startup chance to get cancel mode, etc. set up
- * before we cancel it. */
- if(alive_ms < 5)
- curlx_wait_ms(5 - alive_ms);
CURL_TRC_DNS(data, "cancelling resolve thread");
(void)Curl_thread_cancel(&addr_ctx->thread_hnd);
}
{
struct async_thrdd_ctx *thrdd = &data->state.async.thrdd;
CURLcode result = CURLE_OK;
+ bool thrd_done;
#if !defined(USE_HTTPSRR_ARES) && defined(CURL_DISABLE_SOCKETPAIR)
(void)ps;
if(!thrdd->addr)
return result;
+ Curl_mutex_acquire(&thrdd->addr->mutx);
+ thrd_done = thrdd->addr->thrd_done;
+ Curl_mutex_release(&thrdd->addr->mutx);
+
+ if(!thrd_done) {
#ifndef CURL_DISABLE_SOCKETPAIR
/* return read fd to client for polling the DNS resolution status */
- if(thrdd->addr->sock_pair[0] != CURL_SOCKET_BAD) {
result = Curl_pollset_add_in(data, ps, thrdd->addr->sock_pair[0]);
- }
#else
- {
timediff_t milli;
timediff_t ms = curlx_timediff(curlx_now(), thrdd->addr->start);
if(ms < 3)
else
milli = 200;
Curl_expire(data, milli, EXPIRE_ASYNC_NAME);
- }
#endif
+ }
return result;
}