nameserv: allow concurrent asynchronous requests

Allow multiple resolving threads to be running at the same time in order
to support multiple callers, but use a mutex to avoid sending multiple
requests to the privops helper. This will be needed for the NTS-KE
server negotiation.
This commit is contained in:
Miroslav Lichvar 2019-11-11 19:02:30 +01:00
parent e43d699973
commit 24538fe3e9

View file

@ -51,7 +51,7 @@ struct DNS_Async_Instance {
int pipe[2]; int pipe[2];
}; };
static int resolving_threads = 0; static pthread_mutex_t privops_lock = PTHREAD_MUTEX_INITIALIZER;
/* ================================================== */ /* ================================================== */
@ -60,7 +60,9 @@ start_resolving(void *anything)
{ {
struct DNS_Async_Instance *inst = (struct DNS_Async_Instance *)anything; struct DNS_Async_Instance *inst = (struct DNS_Async_Instance *)anything;
pthread_mutex_lock(&privops_lock);
inst->status = PRV_Name2IPAddress(inst->name, inst->addresses, DNS_MAX_ADDRESSES); inst->status = PRV_Name2IPAddress(inst->name, inst->addresses, DNS_MAX_ADDRESSES);
pthread_mutex_unlock(&privops_lock);
/* Notify the main thread that the result is ready */ /* Notify the main thread that the result is ready */
if (write(inst->pipe[1], "", 1) < 0) if (write(inst->pipe[1], "", 1) < 0)
@ -81,8 +83,6 @@ end_resolving(int fd, int event, void *anything)
LOG_FATAL("pthread_join() failed"); LOG_FATAL("pthread_join() failed");
} }
resolving_threads--;
SCH_RemoveFileHandler(inst->pipe[0]); SCH_RemoveFileHandler(inst->pipe[0]);
close(inst->pipe[0]); close(inst->pipe[0]);
close(inst->pipe[1]); close(inst->pipe[1]);
@ -116,9 +116,6 @@ DNS_Name2IPAddressAsync(const char *name, DNS_NameResolveHandler handler, void *
UTI_FdSetCloexec(inst->pipe[0]); UTI_FdSetCloexec(inst->pipe[0]);
UTI_FdSetCloexec(inst->pipe[1]); UTI_FdSetCloexec(inst->pipe[1]);
resolving_threads++;
assert(resolving_threads <= 1);
if (pthread_create(&inst->thread, NULL, start_resolving, inst)) { if (pthread_create(&inst->thread, NULL, start_resolving, inst)) {
LOG_FATAL("pthread_create() failed"); LOG_FATAL("pthread_create() failed");
} }