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));
pthread_mutex_lock (&svm->mutex);
oldheap = svm_push_data_heap (svm);
- vl_input_queue = svm_queue_init (input_queue_size, sizeof (uword),
- getpid (), 0);
- pthread_mutex_unlock (&svm->mutex);
+ vl_input_queue = svm_queue_alloc_and_init (input_queue_size, sizeof (uword),
+ getpid ());
svm_pop_heap (oldheap);
+ pthread_mutex_unlock (&svm->mutex);
am->my_client_index = ~0;
am->my_registration = 0;
am->vl_input_queue = vl_input_queue;
mp = vl_msg_api_alloc (sizeof (vl_api_memclnt_create_t));
- memset (mp, 0, sizeof (*mp));
+ clib_memset (mp, 0, sizeof (*mp));
mp->_vl_msg_id = ntohs (VL_API_MEMCLNT_CREATE);
mp->ctx_quota = ctx_quota;
mp->input_queue = (uword) vl_input_queue;
}
void
-vl_client_disconnect (void)
+vl_client_send_disconnect (u8 do_cleanup)
{
vl_api_memclnt_delete_t *mp;
- vl_api_memclnt_delete_reply_t *rp;
- svm_queue_t *vl_input_queue;
vl_shmem_hdr_t *shmem_hdr;
- time_t begin;
api_main_t *am = &api_main;
ASSERT (am->vlib_rp);
shmem_hdr = am->shmem_hdr;
ASSERT (shmem_hdr && shmem_hdr->vl_input_queue);
- vl_input_queue = am->vl_input_queue;
-
mp = vl_msg_api_alloc (sizeof (vl_api_memclnt_delete_t));
- memset (mp, 0, sizeof (*mp));
+ clib_memset (mp, 0, sizeof (*mp));
mp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE);
mp->index = am->my_client_index;
mp->handle = (uword) am->my_registration;
+ mp->do_cleanup = do_cleanup;
vl_msg_api_send_shmem (shmem_hdr->vl_input_queue, (u8 *) & mp);
+}
+
+int
+vl_client_disconnect (void)
+{
+ vl_api_memclnt_delete_reply_t *rp;
+ svm_queue_t *vl_input_queue;
+ api_main_t *am = &api_main;
+ time_t begin;
+
+ vl_input_queue = am->vl_input_queue;
+ vl_client_send_disconnect (0 /* wait for reply */ );
/*
* Have to be careful here, in case the client is disconnecting
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;
}
/**
shmem_hdr = am->shmem_hdr;
rmp = vl_msg_api_alloc_as_if_client (sizeof (*rmp));
- memset (rmp, 0, sizeof (*rmp));
+ clib_memset (rmp, 0, sizeof (*rmp));
rmp->_vl_msg_id = ntohs (VL_API_MEMCLNT_KEEPALIVE_REPLY);
rmp->context = mp->context;
vl_msg_api_send_shmem (shmem_hdr->vl_input_queue, (u8 *) & rmp);
void
vl_client_api_unmap (void)
{
- vl_unmap_shmem ();
+ vl_unmap_shmem_client ();
}
u8
if (do_unmap)
vl_client_api_unmap ();
}
- memset (mm, 0, sizeof (*mm));
+ clib_memset (mm, 0, sizeof (*mm));
}
void
if (strlen (plugin_name) + 1 > sizeof (mp->name))
return (rv);
- memset (&clib_time, 0, sizeof (clib_time));
+ clib_memset (&clib_time, 0, sizeof (clib_time));
clib_time_init (&clib_time);
/* Push this plugin's first_msg_id_reply handler */
if (!am->my_registration)
{
mp = vl_socket_client_msg_alloc (sizeof (*mp));
- memset (mp, 0, sizeof (*mp));
+ clib_memset (mp, 0, sizeof (*mp));
mp->_vl_msg_id = ntohs (VL_API_GET_FIRST_MSG_ID);
mp->client_index = am->my_client_index;
strncpy ((char *) mp->name, plugin_name, sizeof (mp->name) - 1);
else
{
mp = vl_msg_api_alloc (sizeof (*mp));
- memset (mp, 0, sizeof (*mp));
+ clib_memset (mp, 0, sizeof (*mp));
mp->_vl_msg_id = ntohs (VL_API_GET_FIRST_MSG_ID);
mp->client_index = am->my_client_index;
strncpy ((char *) mp->name, plugin_name, sizeof (mp->name) - 1);