summaryrefslogtreecommitdiffstats
path: root/src/vpp-api/client
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2018-06-04 22:27:49 +0200
committerDave Barach <openvpp@barachs.net>2018-06-05 14:30:01 +0000
commit73710c7da2f8deaea83dbbbfce8737c9c6cd2949 (patch)
tree7d9cc75fe38de525a5b78634317e94b83880534a /src/vpp-api/client
parent0b061112f73fda45084671120411a6484d9c11d2 (diff)
VPP API: Memory trace
if you plan to put a hash into shared memory, the key sum and key equal functions MUST be set to constants such as KEY_FUNC_STRING, KEY_FUNC_MEM, etc. -lvppinfra is PIC, which means that the process which set up the hash won't have the same idea where the key sum and key compare functions live in other processes. Change-Id: Ib3b5963a0d2fb467b91e1f16274df66ac74009e9 Signed-off-by: Ole Troan <ot@cisco.com> Signed-off-by: Dave Barach <dave@barachs.net> Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src/vpp-api/client')
-rw-r--r--src/vpp-api/client/client.c36
-rw-r--r--src/vpp-api/client/test.c32
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);
}