mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-30 00:50:03 +00:00
Merge pull request #9758 from idryzhov/resolver-thread
lib: fix incorrect thread management
This commit is contained in:
commit
b7a88ee291
@ -53,14 +53,14 @@ static int resolver_cb_socket_readable(struct thread *t)
|
|||||||
{
|
{
|
||||||
struct resolver_state *r = THREAD_ARG(t);
|
struct resolver_state *r = THREAD_ARG(t);
|
||||||
int fd = THREAD_FD(t);
|
int fd = THREAD_FD(t);
|
||||||
|
struct thread **t_ptr;
|
||||||
|
|
||||||
vector_set_index(r->read_threads, fd, THREAD_RUNNING);
|
vector_set_index(r->read_threads, fd, THREAD_RUNNING);
|
||||||
ares_process_fd(r->channel, fd, ARES_SOCKET_BAD);
|
ares_process_fd(r->channel, fd, ARES_SOCKET_BAD);
|
||||||
if (vector_lookup(r->read_threads, fd) == THREAD_RUNNING) {
|
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,
|
thread_add_read(r->master, resolver_cb_socket_readable, r, fd,
|
||||||
&t);
|
t_ptr);
|
||||||
vector_set_index(r->read_threads, fd, t);
|
|
||||||
}
|
}
|
||||||
resolver_update_timeouts(r);
|
resolver_update_timeouts(r);
|
||||||
|
|
||||||
@ -71,14 +71,14 @@ static int resolver_cb_socket_writable(struct thread *t)
|
|||||||
{
|
{
|
||||||
struct resolver_state *r = THREAD_ARG(t);
|
struct resolver_state *r = THREAD_ARG(t);
|
||||||
int fd = THREAD_FD(t);
|
int fd = THREAD_FD(t);
|
||||||
|
struct thread **t_ptr;
|
||||||
|
|
||||||
vector_set_index(r->write_threads, fd, THREAD_RUNNING);
|
vector_set_index(r->write_threads, fd, THREAD_RUNNING);
|
||||||
ares_process_fd(r->channel, ARES_SOCKET_BAD, fd);
|
ares_process_fd(r->channel, ARES_SOCKET_BAD, fd);
|
||||||
if (vector_lookup(r->write_threads, fd) == THREAD_RUNNING) {
|
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,
|
thread_add_write(r->master, resolver_cb_socket_writable, r, fd,
|
||||||
&t);
|
t_ptr);
|
||||||
vector_set_index(r->write_threads, fd, t);
|
|
||||||
}
|
}
|
||||||
resolver_update_timeouts(r);
|
resolver_update_timeouts(r);
|
||||||
|
|
||||||
@ -105,14 +105,15 @@ static void ares_socket_cb(void *data, ares_socket_t fd, int readable,
|
|||||||
int writable)
|
int writable)
|
||||||
{
|
{
|
||||||
struct resolver_state *r = (struct resolver_state *)data;
|
struct resolver_state *r = (struct resolver_state *)data;
|
||||||
struct thread *t;
|
struct thread *t, **t_ptr;
|
||||||
|
|
||||||
if (readable) {
|
if (readable) {
|
||||||
t = vector_lookup_ensure(r->read_threads, fd);
|
t = vector_lookup(r->read_threads, fd);
|
||||||
if (!t) {
|
if (!t) {
|
||||||
|
t_ptr = (struct thread **)vector_get_index(
|
||||||
|
r->read_threads, fd);
|
||||||
thread_add_read(r->master, resolver_cb_socket_readable,
|
thread_add_read(r->master, resolver_cb_socket_readable,
|
||||||
r, fd, &t);
|
r, fd, t_ptr);
|
||||||
vector_set_index(r->read_threads, fd, t);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
t = vector_lookup(r->read_threads, fd);
|
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) {
|
if (writable) {
|
||||||
t = vector_lookup_ensure(r->write_threads, fd);
|
t = vector_lookup(r->write_threads, fd);
|
||||||
if (!t) {
|
if (!t) {
|
||||||
|
t_ptr = (struct thread **)vector_get_index(
|
||||||
|
r->write_threads, fd);
|
||||||
thread_add_read(r->master, resolver_cb_socket_writable,
|
thread_add_read(r->master, resolver_cb_socket_writable,
|
||||||
r, fd, &t);
|
r, fd, t_ptr);
|
||||||
vector_set_index(r->write_threads, fd, t);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
t = vector_lookup(r->write_threads, fd);
|
t = vector_lookup(r->write_threads, fd);
|
||||||
|
11
lib/vector.c
11
lib/vector.c
@ -123,6 +123,17 @@ int vector_set_index(vector v, unsigned int i, void *val)
|
|||||||
return i;
|
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. */
|
/* Look up vector. */
|
||||||
void *vector_lookup(vector v, unsigned int i)
|
void *vector_lookup(vector v, unsigned int i)
|
||||||
{
|
{
|
||||||
|
@ -54,6 +54,7 @@ extern void vector_ensure(vector v, unsigned int num);
|
|||||||
extern int vector_empty_slot(vector v);
|
extern int vector_empty_slot(vector v);
|
||||||
extern int vector_set(vector v, void *val);
|
extern int vector_set(vector v, void *val);
|
||||||
extern int vector_set_index(vector v, unsigned int i, 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(vector v, unsigned int i);
|
||||||
extern void vector_unset_value(vector v, void *val);
|
extern void vector_unset_value(vector v, void *val);
|
||||||
extern void vector_remove(vector v, unsigned int ix);
|
extern void vector_remove(vector v, unsigned int ix);
|
||||||
|
Loading…
Reference in New Issue
Block a user