break;
}
}
+ if (vec_len (vm->pending_rpc_requests))
+ {
+ vm->queue_signal_pending = 1;
+ vm->api_queue_nonempty = 1;
+ vlib_process_signal_event (vm, vl_api_clnt_node.index,
+ /* event_type */ QUEUE_SIGNAL_EVENT,
+ /* event_data */ 0);
+ }
}
/*
{
api_main_t *am = &api_main;
int i;
- uword *rpc_requests, mp;
+ uword *tmp, mp;
+ /*
+ * Swap pending and processing vectors, then process the RPCs
+ * Avoid deadlock conditions by construction.
+ */
clib_spinlock_lock_if_init (&vm->pending_rpc_lock);
- rpc_requests = vm->pending_rpc_requests;
+ tmp = vm->processing_rpc_requests;
+ vec_reset_length (tmp);
+ vm->processing_rpc_requests = vm->pending_rpc_requests;
+ vm->pending_rpc_requests = tmp;
+ clib_spinlock_unlock_if_init (&vm->pending_rpc_lock);
- for (i = 0; i < vec_len (rpc_requests); i++)
+ for (i = 0; i < vec_len (vm->processing_rpc_requests); i++)
{
- mp = rpc_requests[i];
+ mp = vm->processing_rpc_requests[i];
vl_msg_api_handler_with_vm_node (am, (void *) mp, vm, node);
}
- vec_reset_length (vm->pending_rpc_requests);
- clib_spinlock_unlock_if_init (&vm->pending_rpc_lock);
return 0;
}