From e86a8edd3c14fb41ace2a12efd17bc7772bf623f Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Fri, 5 Jan 2018 03:20:25 -0800 Subject: api: refactor vlibmemory - separate client/server code for both memory and socket apis - separate memory api code from generic vlib api code - move unix_shared_memory_fifo to svm and rename to svm_fifo_t - overall declutter Change-Id: I90cdd98ff74d0787d58825b914b0f1eafcfa4dc2 Signed-off-by: Florin Coras --- src/vlib/node.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'src/vlib/node.c') diff --git a/src/vlib/node.c b/src/vlib/node.c index e6739dc7cf9..17dd2ea87d4 100644 --- a/src/vlib/node.c +++ b/src/vlib/node.c @@ -543,6 +543,60 @@ vlib_register_all_static_nodes (vlib_main_t * vm) } } +vlib_node_t *** +vlib_node_get_nodes (vlib_main_t * vm, u32 max_threads, int include_stats) +{ + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n; + static vlib_node_t ***node_dups; + vlib_node_t **nodes; + static vlib_main_t **stat_vms; + vlib_main_t *stat_vm; + uword i, j; + u32 threads_to_serialize; + + vec_reset_length (node_dups); + + if (vec_len (stat_vms) == 0) + { + for (i = 0; i < vec_len (vlib_mains); i++) + { + stat_vm = vlib_mains[i]; + if (stat_vm) + vec_add1 (stat_vms, stat_vm); + } + } + + threads_to_serialize = clib_min (max_threads, vec_len (stat_vms)); + + /* + * Barrier sync across stats scraping. + * Otherwise, the counts will be grossly inaccurate. + */ + vlib_worker_thread_barrier_sync (vm); + + for (j = 0; j < threads_to_serialize; j++) + { + stat_vm = stat_vms[j]; + nm = &stat_vm->node_main; + + if (include_stats) + { + for (i = 0; i < vec_len (nm->nodes); i++) + { + n = nm->nodes[i]; + vlib_node_sync_stats (stat_vm, n); + } + } + + nodes = vec_dup (nm->nodes); + vec_add1 (node_dups, nodes); + } + vlib_worker_thread_barrier_release (vm); + + return node_dups; +} + clib_error_t * vlib_node_main_init (vlib_main_t * vm) { -- cgit 1.2.3-korg