X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvpp-api%2Fclient%2Fclient.c;h=68269bb9b5504e98fa3703cc6a8b67ae08f39584;hb=94495f2a6a68ac2202b7715ce09620f1ba6fe673;hp=f1488e2e513db535b4f0fdd43286ee779cdcc4dc;hpb=6a5adc369591fcac2447e9809deaa22f56b53911;p=vpp.git diff --git a/src/vpp-api/client/client.c b/src/vpp-api/client/client.c index f1488e2e513..68269bb9b55 100644 --- a/src/vpp-api/client/client.c +++ b/src/vpp-api/client/client.c @@ -62,6 +62,7 @@ typedef struct { pthread_cond_t suspend_cv; pthread_cond_t resume_cv; pthread_mutex_t timeout_lock; + u8 timeout_loop; pthread_cond_t timeout_cv; pthread_cond_t timeout_cancel_cv; pthread_cond_t terminate_cv; @@ -71,6 +72,7 @@ vac_main_t vac_main; vac_callback_t vac_callback; u16 read_timeout = 0; bool rx_is_running = false; +bool timeout_thread_cancelled = false; /* Set to true to enable memory tracing */ bool mem_trace = false; @@ -115,6 +117,7 @@ init (void) pthread_cond_init(&pm->suspend_cv, NULL); pthread_cond_init(&pm->resume_cv, NULL); pthread_mutex_init(&pm->timeout_lock, NULL); + pm->timeout_loop = 1; pthread_cond_init(&pm->timeout_cv, NULL); pthread_cond_init(&pm->timeout_cancel_cv, NULL); pthread_cond_init(&pm->terminate_cv, NULL); @@ -234,7 +237,7 @@ vac_timeout_thread_fn (void *arg) u16 timeout; int rv; - while (1) + while (pm->timeout_loop) { /* Wait for poke */ pthread_mutex_lock(&pm->timeout_lock); @@ -246,7 +249,7 @@ vac_timeout_thread_fn (void *arg) rv = pthread_cond_timedwait (&pm->timeout_cancel_cv, &pm->timeout_lock, &ts); pthread_mutex_unlock(&pm->timeout_lock); - if (rv == ETIMEDOUT) + if (rv == ETIMEDOUT && !timeout_thread_cancelled) { ep = vl_msg_api_alloc (sizeof (*ep)); ep->_vl_msg_id = ntohs(VL_API_MEMCLNT_READ_TIMEOUT); @@ -270,7 +273,7 @@ vac_rx_suspend (void) ep = vl_msg_api_alloc (sizeof (*ep)); ep->_vl_msg_id = ntohs(VL_API_MEMCLNT_RX_THREAD_SUSPEND); vl_msg_api_send_shmem(am->vl_input_queue, (u8 *)&ep); - /* Wait for RX thread to tell us it has suspendend */ + /* Wait for RX thread to tell us it has suspended */ pthread_cond_wait(&pm->suspend_cv, &pm->queue_lock); rx_is_running = false; } @@ -316,7 +319,7 @@ vac_connect (char * name, char * chroot_prefix, vac_callback_t cb, vl_set_memory_root_path (chroot_prefix); if ((rv = vl_client_api_map("/vpe-api"))) { - clib_warning ("vl_client_api map rv %d", rv); + clib_warning ("vl_client_api_map returned %d", rv); return rv; } @@ -402,7 +405,8 @@ vac_disconnect (void) } if (pm->timeout_thread_handle) { /* cancel, wake then join the timeout thread */ - pthread_cancel(pm->timeout_thread_handle); + pm->timeout_loop = 0; + timeout_thread_cancelled = true; set_timeout(0); pthread_join(pm->timeout_thread_handle, (void **) &junk); } @@ -448,14 +452,11 @@ vac_read (char **p, int *l, u16 timeout) u16 msg_id = ntohs(*((u16 *)msg)); switch (msg_id) { case VL_API_RX_THREAD_EXIT: - printf("Received thread exit\n"); vl_msg_api_free((void *) msg); return -1; case VL_API_MEMCLNT_RX_THREAD_SUSPEND: - printf("Received thread suspend\n"); goto error; case VL_API_MEMCLNT_READ_TIMEOUT: - printf("Received read timeout %ds\n", timeout); goto error; case VL_API_MEMCLNT_KEEPALIVE: /* Handle an alive-check ping from vpp. */ @@ -477,7 +478,7 @@ vac_read (char **p, int *l, u16 timeout) msgbuf = (msgbuf_t *)(((u8 *)msg) - offsetof(msgbuf_t, data)); *l = ntohl(msgbuf->data_len); if (*l == 0) { - printf("Unregistered API message: %d\n", msg_id); + fprintf(stderr, "Unregistered API message: %d\n", msg_id); goto error; } } @@ -487,7 +488,7 @@ vac_read (char **p, int *l, u16 timeout) unset_timeout(); } else { - printf("Read failed with %d\n", rv); + fprintf(stderr, "Read failed with %d\n", rv); } return (rv); @@ -506,7 +507,7 @@ typedef VL_API_PACKED(struct _vl_api_header { u32 client_index; }) vl_api_header_t; -static unsigned int +static u32 vac_client_index (void) { return (api_main.my_client_index); @@ -529,7 +530,7 @@ vac_write (char *p, int l) q = am->shmem_hdr->vl_input_queue; rv = svm_queue_add(q, (u8 *)&mp, 0); if (rv != 0) { - clib_warning("vpe_api_write fails: %d\n", rv); + fprintf(stderr, "vpe_api_write fails: %d\n", rv); /* Clear message */ vac_free(mp); }