diff options
Diffstat (limited to 'src/vlibmemory')
-rw-r--r-- | src/vlibmemory/memory_api.c | 1 | ||||
-rw-r--r-- | src/vlibmemory/memory_client.c | 43 |
2 files changed, 28 insertions, 16 deletions
diff --git a/src/vlibmemory/memory_api.c b/src/vlibmemory/memory_api.c index 0ee1384f22b..205bea57532 100644 --- a/src/vlibmemory/memory_api.c +++ b/src/vlibmemory/memory_api.c @@ -339,6 +339,7 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp) regp->vl_api_registration_pool_index); pthread_mutex_lock (&svm->mutex); oldheap = svm_push_data_heap (svm); + vec_free (regp->name); /* Poison the old registration */ memset (regp, 0xF1, sizeof (*regp)); clib_mem_free (regp); diff --git a/src/vlibmemory/memory_client.c b/src/vlibmemory/memory_client.c index 9c8dcaa9d64..55ef0011cb7 100644 --- a/src/vlibmemory/memory_client.c +++ b/src/vlibmemory/memory_client.c @@ -105,6 +105,29 @@ vl_api_rx_thread_exit_t_handler (vl_api_rx_thread_exit_t * mp) } static void +vl_api_name_and_crc_free (void) +{ + api_main_t *am = &api_main; + int i; + u8 **keys = 0; + hash_pair_t *hp; + + if (!am->msg_index_by_name_and_crc) + return; + + /* *INDENT-OFF* */ + hash_foreach_pair (hp, am->msg_index_by_name_and_crc, + ({ + vec_add1 (keys, (u8 *) hp->key); + })); + /* *INDENT-ON* */ + for (i = 0; i < vec_len (keys); i++) + vec_free (keys[i]); + vec_free (keys); + hash_free (am->msg_index_by_name_and_crc); +} + +static void vl_api_memclnt_create_reply_t_handler (vl_api_memclnt_create_reply_t * mp) { serialize_main_t _sm, *sm = &_sm; @@ -119,21 +142,7 @@ vl_api_memclnt_create_reply_t_handler (vl_api_memclnt_create_reply_t * mp) am->my_registration = (vl_api_registration_t *) (uword) mp->handle; /* Clean out any previous hash table (unlikely) */ - if (am->msg_index_by_name_and_crc) - { - int i; - u8 **keys = 0; - hash_pair_t *hp; - /* *INDENT-OFF* */ - hash_foreach_pair (hp, am->msg_index_by_name_and_crc, - ({ - vec_add1 (keys, (u8 *) hp->key); - })); - /* *INDENT-ON* */ - for (i = 0; i < vec_len (keys); i++) - vec_free (keys[i]); - vec_free (keys); - } + vl_api_name_and_crc_free (); am->msg_index_by_name_and_crc = hash_create_string (0, sizeof (uword)); @@ -192,8 +201,8 @@ vl_client_connect (const char *name, int ctx_quota, int input_queue_size) oldheap = svm_push_data_heap (svm); vl_input_queue = svm_queue_init (input_queue_size, sizeof (uword), getpid (), 0); - pthread_mutex_unlock (&svm->mutex); svm_pop_heap (oldheap); + pthread_mutex_unlock (&svm->mutex); am->my_client_index = ~0; am->my_registration = 0; @@ -317,6 +326,8 @@ vl_client_disconnect (void) vl_msg_api_handler ((void *) rp); break; } + + vl_api_name_and_crc_free (); return 0; } |