]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: Refactore thread_process_fd
authorDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 4 Mar 2016 03:52:12 +0000 (03:52 +0000)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 4 Mar 2016 17:33:56 +0000 (12:33 -0500)
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>
lib/thread.c

index b2c321c6d17d40a7b6b457137c8165d31adeccde..9c009ead1bca0810ea5b6860aadae8a0f8a446bc 100644 (file)
@@ -1070,25 +1070,45 @@ thread_run (struct thread_master *m, struct thread *thread,
 }
 
 static int
-thread_process_fd (struct thread **thread_array, thread_fd_set *fdset,
-                  thread_fd_set *mfdset, int num, int fd_limit)
+thread_process_fds_helper (struct thread_master *m, struct thread *thread, thread_fd_set *fdset)
+{
+  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;
 
-  assert (thread_array);
-  
-  for (index = 0; index < fd_limit && ready < num; ++index)
+  for (index = 0; index < m->fd_limit && ready < num; ++index)
     {
-      thread = thread_array[index];
-      if (thread && fd_is_set (THREAD_FD (thread), fdset))
-        {
-          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++;
-        }
+      ready += thread_process_fds_helper (m, m->read[index], rset);
+      ready += thread_process_fds_helper (m, m->write[index], wset);
     }
   return num - ready;
 }
@@ -1217,7 +1237,7 @@ thread_fetch (struct thread_master *m, struct thread *fetch)
           if (errno == EINTR)
             continue; /* signal received - process it */
           zlog_warn ("select() error: %s", safe_strerror (errno));
-            return NULL;
+          return NULL;
         }
 
 #if defined HAVE_SNMP && defined SNMP_AGENTX
@@ -1242,12 +1262,7 @@ thread_fetch (struct thread_master *m, struct thread *fetch)
       
       /* Got IO, process it */
       if (num > 0)
-        {
-          /* 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);
-        }
+        thread_process_fds (m, &readfd, &writefd, num);
 
 #if 0
       /* If any threads were made ready above (I/O or foreground timer),