misc: add callback hooks and refactor pmc

Callbacks for monitoring and performance measurement:
- Add new callback list type, with context
- Add callbacks for API, CLI, and barrier sync
- Modify node dispatch callback to pass plugin-specific context
- Modify perfmon plugin to keep PMC samples local to the plugin
- Include process nodes in dispatch callback
- Pass dispatch function return value to callback

Type: refactor

Signed-off-by: Tom Seidenberg <tseidenb@cisco.com>
Change-Id: I28b06c58490611e08d76ff5b01b2347ba2109b22
diff --git a/src/vlib/init.h b/src/vlib/init.h
index fc63801..68ac2f3 100644
--- a/src/vlib/init.h
+++ b/src/vlib/init.h
@@ -317,6 +317,19 @@
     _error;							\
   })
 
+#define vlib_call_main_loop_enter_function(vm, x)			\
+  ({									\
+    extern vlib_init_function_t * VLIB_MAIN_LOOP_ENTER_FUNCTION_SYMBOL (x); \
+    vlib_init_function_t * _f = VLIB_MAIN_LOOP_ENTER_FUNCTION_SYMBOL (x); \
+    clib_error_t * _error = 0;						\
+    if (! hash_get (vm->init_functions_called, _f))			\
+      {									\
+	hash_set1 (vm->init_functions_called, _f);			\
+	_error = _f (vm);						\
+      }									\
+    _error;								\
+  })
+
 /* External functions. */
 clib_error_t *vlib_call_all_init_functions (struct vlib_main_t *vm);
 clib_error_t *vlib_call_all_config_functions (struct vlib_main_t *vm,