static u64 vector_rate_histogram[SLEEP_N_BUCKETS];
-static void memclnt_queue_signal (int signum);
static void memclnt_queue_callback (vlib_main_t *vm);
static uword
f64 vector_rate;
vlib_set_queue_signal_callback (vm, memclnt_queue_callback);
- am->vlib_signal = SIGUSR1;
- signal (am->vlib_signal, memclnt_queue_signal);
if ((rv = memory_api_init(am->region_name)) < 0) {
clib_warning("memory_api_init returned %d, wait for godot...", rv);
while (1) {
pthread_mutex_lock (&q->mutex);
if (q->cursize == 0) {
+ vm->api_queue_nonempty = 0;
pthread_mutex_unlock (&q->mutex);
if (TRACE_VLIB_MEMORY_QUEUE)
}
headp = (i8 *) (q->data + sizeof(uword)*q->head);
- memcpy (&mp, headp, sizeof(uword));
+ clib_memcpy (&mp, headp, sizeof(uword));
q->head++;
need_broadcast = (q->cursize == q->maxsize/2);
}
event_type = vlib_process_wait_for_event_or_clock (vm, sleep_time);
+ vm->queue_signal_pending = 0;
vlib_process_get_events (vm, 0 /* event_data */);
if (vlib_time_now (vm) > dead_client_scan_time) {
.state = VLIB_NODE_STATE_DISABLED,
};
-static void
-memclnt_queue_signal (int signum)
-{
- vlib_main_t * vm = vlib_get_main();
-
- vm->queue_signal_pending = 1;
-}
-
static void
memclnt_queue_callback (vlib_main_t *vm)
{
-#if 0
- /* If we need to manually suspend / resume the memclnt process */
- vlib_node_t * n = vlib_get_node (vm, memclnt_node.index);
- vlib_process_t * p = vlib_get_process_from_node (vm, n);
-#endif
-
- vm->queue_signal_pending = 0;
- vlib_process_signal_event
- (vm, memclnt_node.index, /* event_type */ 0, /* event_data */ 0);
+ static volatile int * cursizep;
+
+ if (PREDICT_FALSE (cursizep == 0))
+ {
+ api_main_t *am = &api_main;
+ vl_shmem_hdr_t *shmem_hdr = am->shmem_hdr;
+ unix_shared_memory_queue_t * q;
+
+ if (shmem_hdr == 0)
+ return;
+
+ q = shmem_hdr->vl_input_queue;
+ if (q == 0)
+ return;
+ cursizep = &q->cursize;
+ }
+
+ if (*cursizep >= 1)
+ {
+ vm->queue_signal_pending = 1;
+ vm->api_queue_nonempty = 1;
+ vlib_process_signal_event (vm, memclnt_node.index,
+ /* event_type */ 0, /* event_data */ 0);
+ }
}
void vl_enable_disable_memory_api (vlib_main_t *vm, int enable)
vlibmemory_init (vlib_main_t * vm)
{
api_main_t *am = &api_main;
- /* Normally NULL, can be set by cmd line "chroot {prefix foo}" */
- svm_region_init_chroot (am->root_path);
+ /* Normally NULL / 0, set by cmd line "api-segment" */
+ svm_region_init_chroot_uid_gid (am->root_path, am->api_uid, am->api_gid);
return 0;
}
if (mp->need_barrier_sync)
vlib_worker_thread_barrier_sync (vm);
- fp = (void *)(mp->function);
- rv = (*fp)(mp->data);
+ fp = uword_to_pointer(mp->function, int(*)(void *));
+ rv = fp(mp->data);
if (mp->need_barrier_sync)
vlib_worker_thread_barrier_release (vm);
mp = vl_msg_api_alloc_as_if_client (sizeof (*mp) + data_length);
memset (mp, 0, sizeof (*mp));
- memcpy (mp->data, data, data_length);
+ clib_memcpy (mp->data, data, data_length);
mp->_vl_msg_id = ntohs (VL_API_RPC_CALL);
- mp->function = (u64)fp;
+ mp->function = pointer_to_uword(fp);
mp->need_barrier_sync = 1;
/* Use the "normal" control-plane mechanism for the main thread */