bool timeout_cancelled;
bool timeout_in_progress;
+bool rx_thread_done;
/*
* Asynchronous mode:
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);
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;
api_main_t *am = &api_main;
vac_main_t *pm = &vac_main;
uword junk;
+ int rv = 0;
if (!pm->connected_to_vlib) return 0;
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);
int rv;
vl_shmem_hdr_t *shmem_hdr;
- if (!pm->connected_to_vlib) return -1;
+ /* svm_queue_sub(below) returns {-1, -2} */
+ if (!pm->connected_to_vlib) return -3;
*l = 0;
- if (am->our_pid == 0) return (-1);
+ /* svm_queue_sub(below) returns {-1, -2} */
+ if (am->our_pid == 0) return (-4);
/* Poke timeout thread */
if (timeout)