79 for (i = 0; i <
vec_len (ap); i++)
82 if (nbytes > ap[i].
size)
90 pthread_mutex_lock (&q->mutex);
92 rv = (
msgbuf_t *) (&q->data[0] + q->head * q->elsize);
101 pthread_mutex_unlock (&q->mutex);
112 if (q->head == q->maxsize)
116 pthread_mutex_unlock (&q->mutex);
311 struct timespec ts, tsrem;
316 memset (a, 0,
sizeof (*a));
318 a->
name = region_name;
330 pthread_mutex_lock (&vlib_rp->
mutex);
353 for (i = 0; i < 10; i++)
355 if (pthread_mutex_trylock (&q->mutex) == 0)
357 pthread_mutex_unlock (&q->mutex);
361 ts.tv_nsec = 10000 * 1000;
362 while (nanosleep (&ts, &tsrem) < 0)
366 memset (&q->mutex, 0, sizeof (q->mutex));
367 clib_warning (
"forcibly release main input queue mutex");
379 pthread_mutex_unlock (&vlib_rp->
mutex);
383 pthread_mutex_lock (&root_rp->
mutex);
385 pthread_mutex_unlock (&root_rp->
mutex);
389 pthread_mutex_unlock (&vlib_rp->
mutex);
398 pthread_mutex_unlock (&vlib_rp->
mutex);
401 for (i = 0; i < 10000; i++)
404 ts.tv_nsec = 10000 * 1000;
405 while (nanosleep (&ts, &tsrem) < 0)
439 _rp.rp = unix_shared_memory_queue_init ((n), (sz), 0, 0); \ 444 vec_add1(shmem_hdr->vl_rings, _rp); \ 453 _rp.rp = unix_shared_memory_queue_init ((n), (sz), 0, 0); \ 458 vec_add1(shmem_hdr->client_rings, _rp); \ 478 pthread_mutex_unlock (&vlib_rp->
mutex);
564 vec_add1 (keys, (u8 *) hp->key);
567 for (i = 0; i <
vec_len (keys); i++)
579 for (i = 0; i < nmsgs; i++)
635 pthread_mutex_lock (&svm->
mutex);
640 pthread_mutex_unlock (&svm->
mutex);
648 memset (mp, 0,
sizeof (*mp));
649 mp->_vl_msg_id = ntohs (VL_API_MEMCLNT_CREATE);
652 strncpy ((
char *) mp->
name, name, sizeof (mp->
name) - 1);
659 struct timespec ts, tsrem;
663 for (i = 0; i < 1000; i++)
670 ts.tv_nsec = 10000 * 1000;
671 while (nanosleep (&ts, &tsrem) < 0)
679 if (ntohs (rp->_vl_msg_id) != VL_API_MEMCLNT_CREATE_REPLY)
681 clib_warning (
"unexpected reply: id %d", ntohs (rp->_vl_msg_id));
684 rv = clib_net_to_host_u32 (rp->
response);
726 memset (mp, 0,
sizeof (*mp));
727 mp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE);
745 if (now >= (begin + 2))
757 if (ntohs (rp->_vl_msg_id) != VL_API_MEMCLNT_DELETE_REPLY)
811 #define foreach_api_client_msg \ 812 _(MEMCLNT_CREATE_REPLY, memclnt_create_reply) \ 813 _(MEMCLNT_DELETE_REPLY, memclnt_delete_reply) 826 vl_msg_api_set_handlers(VL_API_##N, 0 , \ 827 vl_api_##n##_t_handler, \ 829 sizeof(vl_api_##n##_t), 1); #define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
void vl_client_api_unmap(void)
svm_region_t * svm_get_root_rp(void)
sll srl srl sll sra u16x4 i
int vl_client_api_map(char *region_name)
static void svm_pop_heap(void *oldheap)
static u64 unserialize_likely_small_unsigned_integer(serialize_main_t *m)
void vl_set_global_memory_baseva(u64 baseva)
static vlib_cli_command_t trace
(constructor) VLIB_CLI_COMMAND (trace)
#define foreach_clnt_aring_size
void vl_set_memory_uid(int uid)
unix_shared_memory_queue_t * vl_input_queue
void unix_shared_memory_queue_free(unix_shared_memory_queue_t *q)
void vl_set_global_pvt_heap_size(u64 size)
void vl_unmap_shmem(void)
int vl_client_connect(char *name, int ctx_quota, int input_queue_size)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
#define hash_set_mem(h, key, value)
ring_alloc_t * client_rings
#define pool_is_free(P, E)
Use free bitmap to query whether given element is free.
static vl_api_registration_t * vl_api_client_index_to_registration_internal(u32 handle)
void * vl_msg_api_alloc(int nbytes)
void vl_set_memory_root_path(char *name)
unix_shared_memory_queue_t * vl_input_queue
void vl_set_global_memory_size(u64 size)
u32 vl_api_get_msg_index(u8 *name_and_crc)
vl_api_registration_t * my_registration
static void * svm_push_data_heap(svm_region_t *rp)
vl_api_registration_t ** vl_clients
void * svm_region_find_or_create(svm_map_region_args_t *a)
int vl_map_shmem(char *region_name, int is_vlib)
int unix_shared_memory_queue_add_nolock(unix_shared_memory_queue_t *q, u8 *elem)
#define clib_warning(format, args...)
struct vl_shmem_hdr_ * shmem_hdr
#define hash_create_string(elts, value_bytes)
vl_shmem_hdr_t * shmem_hdr
int unix_shared_memory_queue_add(unix_shared_memory_queue_t *q, u8 *elem, int nowait)
void vl_register_mapped_shmem_region(svm_region_t *rp)
vl_api_registration_t * vl_api_client_index_to_registration(u32 index)
void(** msg_print_handlers)(void *, void *)
void vl_msg_api_send_shmem_nolock(unix_shared_memory_queue_t *q, u8 *elem)
void vl_msg_api_send_shmem(unix_shared_memory_queue_t *q, u8 *elem)
static u32 vl_msg_api_handle_get_index(u32 index)
void vl_set_api_pvt_heap_size(u64 size)
void unserialize_cstring(serialize_main_t *m, char **s)
int unix_shared_memory_queue_sub(unix_shared_memory_queue_t *q, u8 *elem, int nowait)
static void * clib_mem_alloc_or_null(uword size)
void serialize_open_vector(serialize_main_t *m, u8 *vector)
#define vec_free(V)
Free vector's memory (no header).
unix_shared_memory_queue_t * vl_input_queue
unix_shared_memory_queue_t * q
void vl_msg_api_trace(api_main_t *am, vl_api_trace_t *tp, void *msg)
void vl_set_memory_gid(int gid)
static void vl_msg_api_free_nolock(void *a)
static void unserialize_integer(serialize_main_t *m, void *x, u32 n_bytes)
void vl_msg_api_free(void *a)
#define foreach_vl_aring_size
vl_api_trace_t * tx_trace
#define VL_API_EPOCH_MASK
void svm_region_init_chroot(char *root_path)
static void vl_api_memclnt_create_reply_t_handler(vl_api_memclnt_create_reply_t *mp)
unix_shared_memory_queue_t * unix_shared_memory_queue_init(int nels, int elsize, int consumer_pid, int signal_when_queue_non_empty)
static void clib_mem_free(void *p)
static void * clib_mem_alloc(uword size)
#define foreach_api_client_msg
void(** msg_endian_handlers)(void *)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
#define hash_foreach_pair(p, v, body)
Iterate over hash pairs.
void vl_msg_api_handler(void *the_msg)
void svm_region_unmap(void *rp_arg)
void svm_client_scan_this_region_nolock(svm_region_t *rp)
unix_shared_memory_queue_t * vl_api_client_index_to_input_queue(u32 index)
static void vl_api_memclnt_delete_reply_t_handler(vl_api_memclnt_delete_reply_t *mp)
static void * vl_msg_api_alloc_internal(int nbytes, int pool, int may_return_null)
unix_shared_memory_queue_t * rp
void * vl_msg_api_alloc_as_if_client_or_null(int nbytes)
#define hash_get_mem(h, key)
void vl_msg_api_increment_missing_client_counter(void)
void(** msg_handlers)(void *)
void vl_set_api_memory_size(u64 size)
void * vl_msg_api_alloc_as_if_client(int nbytes)
static u32 vl_msg_api_handle_get_epoch(u32 index)
void * vl_msg_api_alloc_or_null(int nbytes)
svm_region_t ** mapped_shmem_regions
uword * msg_index_by_name_and_crc
void vl_client_disconnect(void)
struct _unix_shared_memory_queue unix_shared_memory_queue_t
static svm_region_t * root_rp