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/cli.c b/src/vlib/cli.c
index d14ea68..2697c0a 100644
--- a/src/vlib/cli.c
+++ b/src/vlib/cli.c
@@ -39,6 +39,7 @@
 
 #include <vlib/vlib.h>
 #include <vlib/unix/unix.h>
+#include <vppinfra/callback.h>
 #include <vppinfra/cpu.h>
 #include <vppinfra/elog.h>
 #include <unistd.h>
@@ -563,10 +564,16 @@
 
 	      if (!c->is_mp_safe)
 		vlib_worker_thread_barrier_sync (vm);
+	      if (PREDICT_FALSE (vec_len (cm->perf_counter_cbs) != 0))
+		clib_call_callbacks (cm->perf_counter_cbs, cm,
+				     c - cm->commands, 0 /* before */ );
 
 	      c->hit_counter++;
 	      c_error = c->function (vm, si, c);
 
+	      if (PREDICT_FALSE (vec_len (cm->perf_counter_cbs) != 0))
+		clib_call_callbacks (cm->perf_counter_cbs, cm,
+				     c - cm->commands, 1 /* after */ );
 	      if (!c->is_mp_safe)
 		vlib_worker_thread_barrier_release (vm);