X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvpp-api%2Fclient%2Fclient.c;h=6c922dbe2e8ea8545b428525b9277002c915db04;hb=ec11b13a;hp=cd0b5b9e45dde17097bdc39fa6736f0868d7fbd5;hpb=73710c7da2f8deaea83dbbbfce8737c9c6cd2949;p=vpp.git diff --git a/src/vpp-api/client/client.c b/src/vpp-api/client/client.c index cd0b5b9e45d..6c922dbe2e8 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; @@ -79,13 +81,18 @@ __attribute__((constructor)) static void vac_client_constructor (void) { - u8 *heap; - mheap_t *h; clib_mem_init (0, 1 << 30); - heap = clib_mem_get_per_cpu_heap (); - h = mheap_header (heap); - /* make the main heap thread-safe */ - h->flags |= MHEAP_FLAG_THREAD_SAFE; +#if USE_DLMALLOC == 0 + { + u8 *heap; + mheap_t *h; + + heap = clib_mem_get_per_cpu_heap (); + h = mheap_header (heap); + /* make the main heap thread-safe */ + h->flags |= MHEAP_FLAG_THREAD_SAFE; + } +#endif if (mem_trace) clib_mem_trace (1); } @@ -110,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); @@ -229,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); @@ -241,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); @@ -265,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; } @@ -311,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; } @@ -397,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); } @@ -443,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. */ @@ -472,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; } } @@ -482,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); @@ -524,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); }