aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2019-04-10 19:32:02 +0200
committerNeale Ranns <nranns@cisco.com>2019-04-16 07:02:28 +0000
commitc560789ca85b2325072ef1a209d4b1012dfe07bd (patch)
tree335400088e75959d05967442cb4ed42d05a2c815 /src
parentcf18ca92b86cc589cd482e951cba8a0a5eb5e0d5 (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.c4
-rw-r--r--src/vpp-api/client/client.c9
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);