longjmp (mm->rx_thread_jmpbuf, 1);
}
+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)
{
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));
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;
am->vl_input_queue = 0;
}
-void
+int
vl_client_disconnect (void)
{
vl_api_memclnt_delete_t *mp;
am->my_client_index = ~0;
am->my_registration = 0;
am->shmem_hdr = 0;
- break;
+ return -1;
}
if (svm_queue_sub (vl_input_queue, (u8 *) & rp, SVM_Q_NOWAIT, 0) < 0)
continue;
vl_msg_api_handler ((void *) rp);
break;
}
+
+ vl_api_name_and_crc_free ();
+ return 0;
}
/**
void
vl_client_api_unmap (void)
{
- vl_unmap_shmem ();
+ vl_unmap_shmem_client ();
}
u8