Use __attribute__((weak)) references where necessary 57/13057/2
authorDave Barach <dave@barachs.net>
Thu, 14 Jun 2018 13:18:21 +0000 (09:18 -0400)
committerFlorin Coras <florin.coras@gmail.com>
Thu, 14 Jun 2018 18:52:47 +0000 (18:52 +0000)
It should be possible to use vlib without the vlibmemory library, etc.

Change-Id: Ic2316b93d7dbb728fb4ff42a3ca8b0d747c9425e
Signed-off-by: Dave Barach <dave@barachs.net>
src/vlib/main.c
src/vlibmemory/memory_api.c
src/vpp/api/api.c
src/vpp/conf/startup.conf
src/vpp/stats/stat_segment.c

index e4c4438..f9b38b2 100644 (file)
@@ -1678,6 +1678,18 @@ dummy_queue_signal_callback (vlib_main_t * vm)
 {
 }
 
+#define foreach_weak_reference_stub             \
+_(vlib_map_stat_segment_init)                   \
+_(vpe_api_init)                                 \
+_(vlibmemory_init)                              \
+_(map_api_segment_init)
+
+#define _(name)                                                 \
+clib_error_t *name (vlib_main_t *vm) __attribute__((weak));     \
+clib_error_t *name (vlib_main_t *vm) { return 0; }
+foreach_weak_reference_stub;
+#undef _
+
 /* Main function. */
 int
 vlib_main (vlib_main_t * volatile vm, unformat_input_t * input)
@@ -1717,7 +1729,7 @@ vlib_main (vlib_main_t * volatile vm, unformat_input_t * input)
       goto done;
     }
 
-  if ((error = vlib_call_init_function (vm, map_stat_segment_init)))
+  if ((error = vlib_map_stat_segment_init (vm)))
     {
       clib_error_report (error);
       goto done;
@@ -1742,19 +1754,20 @@ vlib_main (vlib_main_t * volatile vm, unformat_input_t * input)
        goto done;
     }
 
-  if ((error = vlib_call_init_function (vm, vpe_api_init)))
+  /* Direct call / weak reference, for vlib standalone use-cases */
+  if ((error = vpe_api_init (vm)))
     {
       clib_error_report (error);
       goto done;
     }
 
-  if ((error = vlib_call_init_function (vm, vlibmemory_init)))
+  if ((error = vlibmemory_init (vm)))
     {
       clib_error_report (error);
       goto done;
     }
 
-  if ((error = vlib_call_init_function (vm, map_api_segment_init)))
+  if ((error = map_api_segment_init (vm)))
     {
       clib_error_report (error);
       goto done;
index 4d31b35..1da77c5 100644 (file)
@@ -459,7 +459,7 @@ vl_mem_api_init (const char *region_name)
   return 0;
 }
 
-static clib_error_t *
+clib_error_t *
 map_api_segment_init (vlib_main_t * vm)
 {
   api_main_t *am = &api_main;
@@ -473,8 +473,6 @@ map_api_segment_init (vlib_main_t * vm)
   return 0;
 }
 
-VLIB_INIT_FUNCTION (map_api_segment_init);
-
 static void
 send_memclnt_keepalive (vl_api_registration_t * regp, f64 now)
 {
@@ -916,8 +914,6 @@ vlibmemory_init (vlib_main_t * vm)
   return error;
 }
 
-VLIB_INIT_FUNCTION (vlibmemory_init);
-
 void
 vl_set_memory_region_name (const char *name)
 {
index 8e24493..6c06ab4 100644 (file)
@@ -474,7 +474,7 @@ vpe_api_hookup (vlib_main_t * vm)
 
 VLIB_API_INIT_FUNCTION (vpe_api_hookup);
 
-static clib_error_t *
+clib_error_t *
 vpe_api_init (vlib_main_t * vm)
 {
   vpe_api_main_t *am = &vpe_api_main;
@@ -492,9 +492,6 @@ vpe_api_init (vlib_main_t * vm)
   return 0;
 }
 
-VLIB_INIT_FUNCTION (vpe_api_init);
-
-
 static clib_error_t *
 api_segment_config (vlib_main_t * vm, unformat_input_t * input)
 {
index 7ed2798..c1ac123 100644 (file)
@@ -28,6 +28,10 @@ api-segment {
   gid vpp
 }
 
+socksvr {
+  default
+}
+
 cpu {
        ## In the VPP there is one main thread and optionally the user can create worker(s)
        ## The main thread and worker thread(s) can be pinned to CPU core(s) manually or automatically
index 6fb9c83..16a727d 100644 (file)
@@ -186,8 +186,8 @@ vlib_stats_pop_heap2 (u64 * counter_vector, u32 thread_index, void *oldheap)
   ssvm_pop_heap (oldheap);
 }
 
-static clib_error_t *
-map_stat_segment_init (vlib_main_t * vm)
+clib_error_t *
+vlib_map_stat_segment_init (void)
 {
   stats_main_t *sm = &stats_main;
   ssvm_private_t *ssvmp = &sm->stat_segment;
@@ -269,8 +269,6 @@ map_stat_segment_init (vlib_main_t * vm)
   return 0;
 }
 
-VLIB_INIT_FUNCTION (map_stat_segment_init);
-
 typedef struct
 {
   u8 *name;