Merge pull request #9758 from idryzhov/resolver-thread

lib: fix incorrect thread management
This commit is contained in:
Donatas Abraitis 2021-10-07 14:31:25 +03:00 committed by GitHub
commit b7a88ee291
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 13 deletions

View File

@ -53,14 +53,14 @@ static int resolver_cb_socket_readable(struct thread *t)
{
struct resolver_state *r = THREAD_ARG(t);
int fd = THREAD_FD(t);
struct thread **t_ptr;
vector_set_index(r->read_threads, fd, THREAD_RUNNING);
ares_process_fd(r->channel, fd, ARES_SOCKET_BAD);
if (vector_lookup(r->read_threads, fd) == THREAD_RUNNING) {
t = NULL;
t_ptr = (struct thread **)vector_get_index(r->read_threads, fd);
thread_add_read(r->master, resolver_cb_socket_readable, r, fd,
&t);
vector_set_index(r->read_threads, fd, t);
t_ptr);
}
resolver_update_timeouts(r);
@ -71,14 +71,14 @@ static int resolver_cb_socket_writable(struct thread *t)
{
struct resolver_state *r = THREAD_ARG(t);
int fd = THREAD_FD(t);
struct thread **t_ptr;
vector_set_index(r->write_threads, fd, THREAD_RUNNING);
ares_process_fd(r->channel, ARES_SOCKET_BAD, fd);
if (vector_lookup(r->write_threads, fd) == THREAD_RUNNING) {
t = NULL;
t_ptr = (struct thread **)vector_get_index(r->write_threads, fd);
thread_add_write(r->master, resolver_cb_socket_writable, r, fd,
&t);
vector_set_index(r->write_threads, fd, t);
t_ptr);
}
resolver_update_timeouts(r);
@ -105,14 +105,15 @@ static void ares_socket_cb(void *data, ares_socket_t fd, int readable,
int writable)
{
struct resolver_state *r = (struct resolver_state *)data;
struct thread *t;
struct thread *t, **t_ptr;
if (readable) {
t = vector_lookup_ensure(r->read_threads, fd);
t = vector_lookup(r->read_threads, fd);
if (!t) {
t_ptr = (struct thread **)vector_get_index(
r->read_threads, fd);
thread_add_read(r->master, resolver_cb_socket_readable,
r, fd, &t);
vector_set_index(r->read_threads, fd, t);
r, fd, t_ptr);
}
} else {
t = vector_lookup(r->read_threads, fd);
@ -125,11 +126,12 @@ static void ares_socket_cb(void *data, ares_socket_t fd, int readable,
}
if (writable) {
t = vector_lookup_ensure(r->write_threads, fd);
t = vector_lookup(r->write_threads, fd);
if (!t) {
t_ptr = (struct thread **)vector_get_index(
r->write_threads, fd);
thread_add_read(r->master, resolver_cb_socket_writable,
r, fd, &t);
vector_set_index(r->write_threads, fd, t);
r, fd, t_ptr);
}
} else {
t = vector_lookup(r->write_threads, fd);

View File

@ -123,6 +123,17 @@ int vector_set_index(vector v, unsigned int i, void *val)
return i;
}
/* Make a specified index slot active and return its address. */
void **vector_get_index(vector v, unsigned int i)
{
vector_ensure(v, i);
if (v->active <= i)
v->active = i + 1;
return &v->index[i];
}
/* Look up vector. */
void *vector_lookup(vector v, unsigned int i)
{

View File

@ -54,6 +54,7 @@ extern void vector_ensure(vector v, unsigned int num);
extern int vector_empty_slot(vector v);
extern int vector_set(vector v, void *val);
extern int vector_set_index(vector v, unsigned int i, void *val);
extern void **vector_get_index(vector v, unsigned int i);
extern void vector_unset(vector v, unsigned int i);
extern void vector_unset_value(vector v, void *val);
extern void vector_remove(vector v, unsigned int ix);