diff options
Diffstat (limited to 'src/vpp-api')
-rw-r--r-- | src/vpp-api/client/client.c | 36 | ||||
-rw-r--r-- | src/vpp-api/client/test.c | 32 |
2 files changed, 61 insertions, 7 deletions
diff --git a/src/vpp-api/client/client.c b/src/vpp-api/client/client.c index c05ea37e00b..cd0b5b9e45d 100644 --- a/src/vpp-api/client/client.c +++ b/src/vpp-api/client/client.c @@ -72,6 +72,35 @@ vac_callback_t vac_callback; u16 read_timeout = 0; bool rx_is_running = false; +/* Set to true to enable memory tracing */ +bool mem_trace = false; + +__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 (mem_trace) + clib_mem_trace (1); +} + +__attribute__((destructor)) +static void +vac_client_destructor (void) +{ + if (mem_trace) + fformat(stderr, "TRACE: %s", + format (0, "%U\n", + format_mheap, clib_mem_get_heap (), 1)); +} + + static void init (void) { @@ -90,14 +119,14 @@ static void cleanup (void) { vac_main_t *pm = &vac_main; + pthread_mutex_destroy(&pm->queue_lock); pthread_cond_destroy(&pm->suspend_cv); pthread_cond_destroy(&pm->resume_cv); + pthread_mutex_destroy(&pm->timeout_lock); pthread_cond_destroy(&pm->timeout_cv); pthread_cond_destroy(&pm->timeout_cancel_cv); pthread_cond_destroy(&pm->terminate_cv); - pthread_mutex_destroy(&pm->queue_lock); - pthread_mutex_destroy(&pm->timeout_lock); - memset (pm, 0, sizeof (*pm)); + memset(pm, 0, sizeof(*pm)); } /* @@ -415,6 +444,7 @@ vac_read (char **p, int *l, u16 timeout) 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"); diff --git a/src/vpp-api/client/test.c b/src/vpp-api/client/test.c index c1b3808a5f5..8061fe58fb6 100644 --- a/src/vpp-api/client/test.c +++ b/src/vpp-api/client/test.c @@ -70,20 +70,34 @@ wrap_vac_callback (unsigned char *data, int len) result_msg_id = ntohs(*((u16 *)data)); } -int main (int argc, char ** argv) +static void +test_connect () +{ + static int i; + int rv = vac_connect("vac_client", NULL, wrap_vac_callback, 32 /* rx queue-length*/); + if (rv != 0) { + printf("Connect failed: %d\n", rv); + exit(rv); + } + printf("."); + vac_disconnect(); + i++; +} + +static void +test_messages (void) { api_main_t * am = &api_main; vl_api_show_version_t message; vl_api_show_version_t *mp; int async = 1; - int rv = vac_connect("vac_client", NULL, wrap_vac_callback, 32 /* rx queue-length*/); + int rv = vac_connect("vac_client", NULL, wrap_vac_callback, 32 /* rx queue-length*/); if (rv != 0) { printf("Connect failed: %d\n", rv); exit(rv); } - - struct timeb timer_msec; + struct timeb timer_msec; long long int timestamp_msec_start; /* timestamp in millisecond. */ if (!ftime(&timer_msec)) { timestamp_msec_start = ((long long int) timer_msec.time) * 1000ll + @@ -135,5 +149,15 @@ int main (int argc, char ** argv) no_msgs/(timestamp_msec_end - timestamp_msec_start)); printf("Exiting...\n"); vac_disconnect(); +} + +int main (int argc, char ** argv) +{ + int i; + + for (i = 0; i < 1000; i++) { + test_connect(); + } + test_messages(); exit (0); } |