while (1) {
pthread_mutex_lock (&q->mutex);
if (q->cursize == 0) {
+ vm->api_queue_nonempty = 0;
pthread_mutex_unlock (&q->mutex);
if (TRACE_VLIB_MEMORY_QUEUE)
vlib_main_t * vm = vlib_get_main();
vm->queue_signal_pending = 1;
+ vm->api_queue_nonempty = 1;
}
static void
vlib_config_function_runtime_t *config_function_registrations;
mc_serialize_msg_t *mc_msg_registrations; /* mc_main is a pointer... */
- /* control-plane API queue signal pending */
+ /* control-plane API queue signal pending, length indication */
volatile u32 queue_signal_pending;
+ volatile u32 api_queue_nonempty;
void (*queue_signal_callback)(struct vlib_main_t *);
u8 **argv;
} vlib_main_t;
if (nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] > 0)
timeout_ms = 0;
- if (vector_rate > 1)
+ /*
+ * When busy: don't wait & only epoll for input
+ * every 1024 times through main loop.
+ */
+ if (vector_rate > 1 || vm->api_queue_nonempty)
{
- /* When busy don't wait & only epoll for input every 8 times
- through main loop. */
timeout_ms = 0;
node->input_main_loops_per_call = 1024;
}