diff options
-rw-r--r-- | zebra/zserv.c | 15 | ||||
-rw-r--r-- | zebra/zserv.h | 3 |
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; |