diff options
author | Ole Troan <ot@cisco.com> | 2019-04-10 19:32:02 +0200 |
---|---|---|
committer | Neale Ranns <nranns@cisco.com> | 2019-04-16 07:02:28 +0000 |
commit | c560789ca85b2325072ef1a209d4b1012dfe07bd (patch) | |
tree | 335400088e75959d05967442cb4ed42d05a2c815 /src | |
parent | cf18ca92b86cc589cd482e951cba8a0a5eb5e0d5 (diff) |
API: Handle pthread cond signal case where signal is missed.
Especially on a single core setup the RX thread could signal the main thread
that it was done, before main thread listened to the signal.
Change-Id: Ib70337b21bcf77787ce4ee0aa9cf80c6da2215af
Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/vlibmemory/memory_client.c | 4 | ||||
-rw-r--r-- | src/vpp-api/client/client.c | 9 |
2 files changed, 10 insertions, 3 deletions
diff --git a/src/vlibmemory/memory_client.c b/src/vlibmemory/memory_client.c index 383d7428b72..d002845a00c 100644 --- a/src/vlibmemory/memory_client.c +++ b/src/vlibmemory/memory_client.c @@ -100,8 +100,8 @@ static void vl_api_rx_thread_exit_t_handler (vl_api_rx_thread_exit_t * mp) { memory_client_main_t *mm = &memory_client_main; - vl_msg_api_free (mp); - longjmp (mm->rx_thread_jmpbuf, 1); + if (mm->rx_thread_jmpbuf_valid) + longjmp (mm->rx_thread_jmpbuf, 1); } static void diff --git a/src/vpp-api/client/client.c b/src/vpp-api/client/client.c index 6a12c4ab963..5b47fd4dd7d 100644 --- a/src/vpp-api/client/client.c +++ b/src/vpp-api/client/client.c @@ -35,6 +35,7 @@ bool timeout_cancelled; bool timeout_in_progress; +bool rx_thread_done; /* * Asynchronous mode: @@ -191,6 +192,7 @@ vac_rx_thread_fn (void *arg) vl_msg_api_free((void *) msg); /* signal waiting threads that this thread is about to terminate */ pthread_mutex_lock(&pm->queue_lock); + rx_thread_done = true; pthread_cond_signal(&pm->terminate_cv); pthread_mutex_unlock(&pm->queue_lock); pthread_exit(0); @@ -318,6 +320,7 @@ int vac_connect (char * name, char * chroot_prefix, vac_callback_t cb, int rx_qlen) { + rx_thread_done = false; int rv = 0; vac_main_t *pm = &vac_main; @@ -389,6 +392,7 @@ vac_disconnect (void) api_main_t *am = &api_main; vac_main_t *pm = &vac_main; uword junk; + int rv = 0; if (!pm->connected_to_vlib) return 0; @@ -404,9 +408,12 @@ vac_disconnect (void) gettimeofday(&tv, NULL); ts.tv_sec = tv.tv_sec + 5; ts.tv_nsec = 0; + pthread_mutex_lock(&pm->queue_lock); - int rv = pthread_cond_timedwait(&pm->terminate_cv, &pm->queue_lock, &ts); + if (rx_thread_done == false) + rv = pthread_cond_timedwait(&pm->terminate_cv, &pm->queue_lock, &ts); pthread_mutex_unlock(&pm->queue_lock); + /* now join so we wait until thread has -really- finished */ if (rv == ETIMEDOUT) pthread_cancel(pm->rx_thread_handle); |