From c16f6b34b6b5530f2bbc9c67dfdfdeca2eb8f8c9 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Sun, 3 Jun 2018 21:21:19 -0700 Subject: [PATCH] Join the VAC read timeout thread Change-Id: I5bcbae276f8ac23718c5afc859da222508d07ad7 Signed-off-by: Neale Ranns Signed-off-by: Ole Troan --- src/vpp-api/client/client.c | 46 ++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/vpp-api/client/client.c b/src/vpp-api/client/client.c index fd2c4174285..c05ea37e00b 100644 --- a/src/vpp-api/client/client.c +++ b/src/vpp-api/client/client.c @@ -317,17 +317,36 @@ vac_connect (char * name, char * chroot_prefix, vac_callback_t cb, return (0); } +static void +set_timeout (unsigned short timeout) +{ + vac_main_t *pm = &vac_main; + pthread_mutex_lock(&pm->timeout_lock); + read_timeout = timeout; + pthread_cond_signal(&pm->timeout_cv); + pthread_mutex_unlock(&pm->timeout_lock); +} + +static void +unset_timeout (void) +{ + vac_main_t *pm = &vac_main; + pthread_mutex_lock(&pm->timeout_lock); + pthread_cond_signal(&pm->timeout_cancel_cv); + pthread_mutex_unlock(&pm->timeout_lock); +} + int vac_disconnect (void) { api_main_t *am = &api_main; vac_main_t *pm = &vac_main; + uword junk; if (!pm->connected_to_vlib) return 0; if (pm->rx_thread_handle) { vl_api_rx_thread_exit_t *ep; - uword junk; 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); @@ -347,8 +366,12 @@ vac_disconnect (void) else pthread_join(pm->rx_thread_handle, (void **) &junk); } - if (pm->timeout_thread_handle) + if (pm->timeout_thread_handle) { + /* cancel, wake then join the timeout thread */ pthread_cancel(pm->timeout_thread_handle); + set_timeout(0); + pthread_join(pm->timeout_thread_handle, (void **) &junk); + } vl_client_disconnect(); vl_client_api_unmap(); @@ -359,25 +382,6 @@ vac_disconnect (void) return (0); } -static void -set_timeout (unsigned short timeout) -{ - vac_main_t *pm = &vac_main; - pthread_mutex_lock(&pm->timeout_lock); - read_timeout = timeout; - pthread_cond_signal(&pm->timeout_cv); - pthread_mutex_unlock(&pm->timeout_lock); -} - -static void -unset_timeout (void) -{ - vac_main_t *pm = &vac_main; - pthread_mutex_lock(&pm->timeout_lock); - pthread_cond_signal(&pm->timeout_cancel_cv); - pthread_mutex_unlock(&pm->timeout_lock); -} - int vac_read (char **p, int *l, u16 timeout) { -- 2.16.6