vapi: add vapi_stop_rx_thread()
Type: improvement Allow vapi to signal to an application's RX thread that it should wake up and exit. Before disconnecting from VPP's API, libvlibmemoryclient inserts an rx_thread_exit message into the client's own input queue to cause its RX thread to wake up from its blocking dequeue and exit cleanly. Add a function to vapi's API which will allow libvapi client applications which have an RX thread waiting for incoming messages using vapi_wait() to do the same thing. The existing libvlibmemoryclient code which does this was moved to a separate function and made available for vapi_stop_rx_thread() to call. Also fixed some inconsistencies in indentation of function prototypes in vapi.h to make checkstyle.sh happy. Signed-off-by: Matthew Smith <mgsmith@netgate.com> Change-Id: I7bbb73470807123cc63ef313cfb91d1fd31b34e5
This commit is contained in:
@@ -510,6 +510,14 @@ vl_client_connect_to_vlib_thread_fn (const char *svm_name,
|
||||
thread_fn, arg, 1 /* do map */ );
|
||||
}
|
||||
|
||||
void
|
||||
vl_client_stop_rx_thread (svm_queue_t *vl_input_queue)
|
||||
{
|
||||
vl_api_rx_thread_exit_t *ep;
|
||||
ep = vl_msg_api_alloc (sizeof (*ep));
|
||||
ep->_vl_msg_id = ntohs (VL_API_RX_THREAD_EXIT);
|
||||
vl_msg_api_send_shmem (vl_input_queue, (u8 *) &ep);
|
||||
}
|
||||
|
||||
static void
|
||||
disconnect_from_vlib_internal (u8 do_unmap)
|
||||
@@ -520,10 +528,7 @@ disconnect_from_vlib_internal (u8 do_unmap)
|
||||
|
||||
if (mm->rx_thread_jmpbuf_valid)
|
||||
{
|
||||
vl_api_rx_thread_exit_t *ep;
|
||||
ep = vl_msg_api_alloc (sizeof (*ep));
|
||||
ep->_vl_msg_id = ntohs (VL_API_RX_THREAD_EXIT);
|
||||
vl_msg_api_send_shmem (am->vl_input_queue, (u8 *) & ep);
|
||||
vl_client_stop_rx_thread (am->vl_input_queue);
|
||||
pthread_join (mm->rx_thread_handle, (void **) &junk);
|
||||
}
|
||||
if (mm->connected_to_vlib)
|
||||
|
@@ -62,6 +62,7 @@ int vl_client_connect_to_vlib_no_rx_pthread_no_map (const char *svm_name,
|
||||
int rx_queue_size);
|
||||
void vl_client_install_client_message_handlers (void);
|
||||
u8 vl_mem_client_is_connected (void);
|
||||
void vl_client_stop_rx_thread (svm_queue_t *vl_input_queue);
|
||||
|
||||
always_inline memory_client_main_t *
|
||||
vlibapi_get_memory_client_main (void)
|
||||
|
@@ -1420,6 +1420,16 @@ vapi_get_msg_name (vapi_msg_id_t id)
|
||||
return __vapi_metadata.msgs[id]->name;
|
||||
}
|
||||
|
||||
void
|
||||
vapi_stop_rx_thread (vapi_ctx_t ctx)
|
||||
{
|
||||
if (!ctx || !ctx->connected || !ctx->vl_input_queue)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
vl_client_stop_rx_thread (ctx->vl_input_queue);
|
||||
}
|
||||
/*
|
||||
* fd.io coding-style-patch-verification: ON
|
||||
*
|
||||
|
@@ -208,7 +208,7 @@ vapi_error_e vapi_wait (vapi_ctx_t ctx);
|
||||
*
|
||||
* @return VAPI_OK on success, other error code on error
|
||||
*/
|
||||
vapi_error_e vapi_dispatch_one (vapi_ctx_t ctx);
|
||||
vapi_error_e vapi_dispatch_one (vapi_ctx_t ctx);
|
||||
|
||||
/**
|
||||
* @brief loop vapi_dispatch_one until responses to all currently outstanding
|
||||
@@ -224,11 +224,11 @@ vapi_error_e vapi_wait (vapi_ctx_t ctx);
|
||||
*
|
||||
* @return VAPI_OK on success, other error code on error
|
||||
*/
|
||||
vapi_error_e vapi_dispatch (vapi_ctx_t ctx);
|
||||
vapi_error_e vapi_dispatch (vapi_ctx_t ctx);
|
||||
|
||||
/** generic vapi event callback */
|
||||
typedef vapi_error_e (*vapi_event_cb) (vapi_ctx_t ctx, void *callback_ctx,
|
||||
void *payload);
|
||||
typedef vapi_error_e (*vapi_event_cb) (vapi_ctx_t ctx, void *callback_ctx,
|
||||
void *payload);
|
||||
|
||||
/**
|
||||
* @brief set event callback to call when message with given id is dispatched
|
||||
@@ -238,8 +238,8 @@ vapi_error_e vapi_wait (vapi_ctx_t ctx);
|
||||
* @param callback callback
|
||||
* @param callback_ctx context pointer stored and passed to callback
|
||||
*/
|
||||
void vapi_set_event_cb (vapi_ctx_t ctx, vapi_msg_id_t id,
|
||||
vapi_event_cb callback, void *callback_ctx);
|
||||
void vapi_set_event_cb (vapi_ctx_t ctx, vapi_msg_id_t id,
|
||||
vapi_event_cb callback, void *callback_ctx);
|
||||
|
||||
/**
|
||||
* @brief clear event callback for given message id
|
||||
@@ -247,12 +247,12 @@ vapi_error_e vapi_wait (vapi_ctx_t ctx);
|
||||
* @param ctx opaque vapi context
|
||||
* @param id message id
|
||||
*/
|
||||
void vapi_clear_event_cb (vapi_ctx_t ctx, vapi_msg_id_t id);
|
||||
void vapi_clear_event_cb (vapi_ctx_t ctx, vapi_msg_id_t id);
|
||||
|
||||
/** generic vapi event callback */
|
||||
typedef vapi_error_e (*vapi_generic_event_cb) (vapi_ctx_t ctx,
|
||||
void *callback_ctx,
|
||||
vapi_msg_id_t id, void *msg);
|
||||
typedef vapi_error_e (*vapi_generic_event_cb) (vapi_ctx_t ctx,
|
||||
void *callback_ctx,
|
||||
vapi_msg_id_t id, void *msg);
|
||||
/**
|
||||
* @brief set generic event callback
|
||||
*
|
||||
@@ -263,16 +263,29 @@ vapi_error_e vapi_wait (vapi_ctx_t ctx);
|
||||
* @param callback callback
|
||||
* @param callback_ctx context pointer stored and passed to callback
|
||||
*/
|
||||
void vapi_set_generic_event_cb (vapi_ctx_t ctx,
|
||||
vapi_generic_event_cb callback,
|
||||
void *callback_ctx);
|
||||
void vapi_set_generic_event_cb (vapi_ctx_t ctx, vapi_generic_event_cb callback,
|
||||
void *callback_ctx);
|
||||
|
||||
/**
|
||||
* @brief clear generic event callback
|
||||
*
|
||||
* @param ctx opaque vapi context
|
||||
*/
|
||||
void vapi_clear_generic_event_cb (vapi_ctx_t ctx);
|
||||
void vapi_clear_generic_event_cb (vapi_ctx_t ctx);
|
||||
|
||||
/**
|
||||
* @brief signal RX thread to exit
|
||||
*
|
||||
* @note This adds a message to the client input queue that indicates that
|
||||
* an RX thread should stop processing incoming messages and exit. If an
|
||||
* application has an RX thread which sleeps while waiting for incoming
|
||||
* messages using vapi_wait(), this call will allow the application to
|
||||
* wake up from the vapi_wait() call and figure out that it should stop
|
||||
* running.
|
||||
*
|
||||
* @param ctx opaque vapi context
|
||||
*/
|
||||
void vapi_stop_rx_thread (vapi_ctx_t ctx);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
Reference in New Issue
Block a user