summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--zebra/zserv.c15
-rw-r--r--zebra/zserv.h3
2 files changed, 16 insertions, 2 deletions
diff --git a/zebra/zserv.c b/zebra/zserv.c
index b40e9e2af..a48505a51 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -492,8 +492,8 @@ static int zserv_process_messages(struct thread *thread)
struct zserv *client = THREAD_ARG(thread);
struct stream *msg;
struct stream_fifo *cache = stream_fifo_new();
-
uint32_t p2p = zebrad.packets_to_process;
+ bool need_resched = false;
pthread_mutex_lock(&client->ibuf_mtx);
{
@@ -505,6 +505,12 @@ static int zserv_process_messages(struct thread *thread)
}
msg = NULL;
+
+ /* Need to reschedule processing work if there are still
+ * packets in the fifo.
+ */
+ if (stream_fifo_head(client->ibuf_fifo))
+ need_resched = true;
}
pthread_mutex_unlock(&client->ibuf_mtx);
@@ -516,6 +522,10 @@ static int zserv_process_messages(struct thread *thread)
stream_fifo_free(cache);
+ /* Reschedule ourselves if necessary */
+ if (need_resched)
+ zserv_event(client, ZSERV_PROCESS_MESSAGES);
+
return 0;
}
@@ -628,6 +638,7 @@ void zserv_close_client(struct zserv *client)
thread_cancel_event(zebrad.master, client);
THREAD_OFF(client->t_cleanup);
+ THREAD_OFF(client->t_process);
/* destroy pthread */
frr_pthread_destroy(client->pthread);
@@ -828,7 +839,7 @@ void zserv_event(struct zserv *client, enum zserv_event event)
break;
case ZSERV_PROCESS_MESSAGES:
thread_add_event(zebrad.master, zserv_process_messages, client,
- 0, NULL);
+ 0, &client->t_process);
break;
case ZSERV_HANDLE_CLIENT_FAIL:
thread_add_event(zebrad.master, zserv_handle_client_fail,
diff --git a/zebra/zserv.h b/zebra/zserv.h
index fe1dbdbfe..439082e78 100644
--- a/zebra/zserv.h
+++ b/zebra/zserv.h
@@ -73,6 +73,9 @@ struct zserv {
struct thread *t_read;
struct thread *t_write;
+ /* Event for message processing, for the main pthread */
+ struct thread *t_process;
+
/* Threads for the main pthread */
struct thread *t_cleanup;