gitignore change due to DPDK download suffix change
[vpp.git] / vlib-api / vlibmemory / memory_vlib.c
index 57cb8f7..0fef64c 100644 (file)
@@ -343,7 +343,6 @@ typedef enum {
 
 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
@@ -362,8 +361,6 @@ memclnt_process (vlib_main_t * vm,
     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);
@@ -404,6 +401,7 @@ memclnt_process (vlib_main_t * vm,
         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)
@@ -421,7 +419,7 @@ memclnt_process (vlib_main_t * vm,
             }
             
             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);
@@ -457,6 +455,7 @@ memclnt_process (vlib_main_t * vm,
         }
 
        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) {
@@ -620,26 +619,33 @@ VLIB_REGISTER_NODE (memclnt_node,static) = {
     .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)
@@ -1046,9 +1052,10 @@ VLIB_CLI_COMMAND (trace, static) = {
 clib_error_t *
 vlibmemory_init (vlib_main_t * vm)
 {
-    /* Do this early, to avoid glibc malloc fubar */
-    svm_region_init();
-    return 0;
+  api_main_t *am = &api_main;
+  /* 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;
 }
 
 VLIB_INIT_FUNCTION (vlibmemory_init);
@@ -1060,13 +1067,6 @@ void vl_set_memory_region_name (char *name)
     am->region_name = name;
 }
 
-void vl_set_memory_root_path (char *name)
-{
-    api_main_t *am = &api_main;
-
-    am->root_path = name;
-}
-
 static int range_compare (vl_api_msg_range_t * a0, vl_api_msg_range_t * a1)
 {
     int len0, len1, clen;
@@ -1141,8 +1141,8 @@ static void vl_api_rpc_call_t_handler (vl_api_rpc_call_t * mp)
       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);
@@ -1178,9 +1178,9 @@ void vl_api_rpc_call_main_thread (void *fp, u8 * data, u32 data_length)
 
   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 */