mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-08 11:18:43 +00:00
lib: Refactore thread_process_fd
thread_process_fd is looping over the read and write fd's separately. There is no need to do this individually. loop over both the read and write fdset's at the same time. This will improve select processing performance, especially for large data sets. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
8dadcae730
commit
5d4ccd4e85
57
lib/thread.c
57
lib/thread.c
@ -1070,25 +1070,45 @@ thread_run (struct thread_master *m, struct thread *thread,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
thread_process_fd (struct thread **thread_array, thread_fd_set *fdset,
|
thread_process_fds_helper (struct thread_master *m, struct thread *thread, thread_fd_set *fdset)
|
||||||
thread_fd_set *mfdset, int num, int fd_limit)
|
{
|
||||||
|
thread_fd_set *mfdset = NULL;
|
||||||
|
struct thread **thread_array;
|
||||||
|
|
||||||
|
if (!thread)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (thread->type == THREAD_READ)
|
||||||
|
{
|
||||||
|
mfdset = &m->readfd;
|
||||||
|
thread_array = m->read;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mfdset = &m->writefd;
|
||||||
|
thread_array = m->write;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fd_is_set (THREAD_FD (thread), fdset))
|
||||||
|
{
|
||||||
|
fd_clear_read_write (THREAD_FD (thread), mfdset);
|
||||||
|
thread_delete_fd (thread_array, thread);
|
||||||
|
thread_list_add (&m->ready, thread);
|
||||||
|
thread->type = THREAD_READY;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
thread_process_fds (struct thread_master *m, thread_fd_set *rset, thread_fd_set *wset, int num)
|
||||||
{
|
{
|
||||||
struct thread *thread;
|
|
||||||
int ready = 0, index;
|
int ready = 0, index;
|
||||||
|
|
||||||
assert (thread_array);
|
for (index = 0; index < m->fd_limit && ready < num; ++index)
|
||||||
|
|
||||||
for (index = 0; index < fd_limit && ready < num; ++index)
|
|
||||||
{
|
{
|
||||||
thread = thread_array[index];
|
ready += thread_process_fds_helper (m, m->read[index], rset);
|
||||||
if (thread && fd_is_set (THREAD_FD (thread), fdset))
|
ready += thread_process_fds_helper (m, m->write[index], wset);
|
||||||
{
|
|
||||||
assert (fd_clear_read_write (THREAD_FD (thread), mfdset));
|
|
||||||
thread_delete_fd (thread_array, thread);
|
|
||||||
thread_list_add (&thread->master->ready, thread);
|
|
||||||
thread->type = THREAD_READY;
|
|
||||||
ready++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return num - ready;
|
return num - ready;
|
||||||
}
|
}
|
||||||
@ -1242,12 +1262,7 @@ thread_fetch (struct thread_master *m, struct thread *fetch)
|
|||||||
|
|
||||||
/* Got IO, process it */
|
/* Got IO, process it */
|
||||||
if (num > 0)
|
if (num > 0)
|
||||||
{
|
thread_process_fds (m, &readfd, &writefd, num);
|
||||||
/* Normal priority read thread. */
|
|
||||||
num = thread_process_fd (m->read, &readfd, &m->readfd, num, m->fd_limit);
|
|
||||||
/* Write thread. */
|
|
||||||
num = thread_process_fd (m->write, &writefd, &m->writefd, num, m->fd_limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* If any threads were made ready above (I/O or foreground timer),
|
/* If any threads were made ready above (I/O or foreground timer),
|
||||||
|
Loading…
Reference in New Issue
Block a user