#include <vppinfra/callback.h>
#include <linux/sched.h>
-extern vlib_main_t **vlib_mains;
-
void vlib_set_thread_name (char *name);
/* arg is actually a vlib__thread_t * */
}
}
-typedef enum
+always_inline int
+__foreach_vlib_main_helper (vlib_main_t *ii, vlib_main_t **p)
{
- VLIB_WORKER_THREAD_FORK_FIXUP_ILLEGAL = 0,
- VLIB_WORKER_THREAD_FORK_FIXUP_NEW_SW_IF_INDEX,
-} vlib_fork_fixup_t;
-
-void vlib_worker_thread_fork_fixup (vlib_fork_fixup_t which);
-
-#define foreach_vlib_main(body) \
-do { \
- vlib_main_t ** __vlib_mains = 0, *this_vlib_main; \
- int ii; \
- \
- for (ii = 0; ii < vec_len (vlib_mains); ii++) \
- { \
- this_vlib_main = vlib_mains[ii]; \
- ASSERT (ii == 0 || \
- this_vlib_main->parked_at_barrier == 1); \
- if (this_vlib_main) \
- vec_add1 (__vlib_mains, this_vlib_main); \
- } \
- \
- for (ii = 0; ii < vec_len (__vlib_mains); ii++) \
- { \
- this_vlib_main = __vlib_mains[ii]; \
- /* body uses this_vlib_main... */ \
- (body); \
- } \
- vec_free (__vlib_mains); \
-} while (0);
+ vlib_main_t *vm;
+ u32 index = ii - (vlib_main_t *) 0;
+
+ if (index >= vec_len (vlib_global_main.vlib_mains))
+ return 0;
+
+ *p = vm = vlib_global_main.vlib_mains[index];
+ ASSERT (index == 0 || vm->parked_at_barrier == 1);
+ return 1;
+}
+
+#define foreach_vlib_main() \
+ for (vlib_main_t *ii = 0, *this_vlib_main; \
+ __foreach_vlib_main_helper (ii, &this_vlib_main); ii++) \
+ if (this_vlib_main)
#define foreach_sched_policy \
_(SCHED_OTHER, OTHER, "other") \
{
if (PREDICT_FALSE (*vlib_worker_threads->wait_at_barrier))
{
+ vlib_global_main_t *vgm = vlib_get_global_main ();
vlib_main_t *vm = vlib_get_main ();
u32 thread_index = vm->thread_index;
f64 t = vlib_time_now (vm);
f64 now;
vm->time_offset = 0.0;
now = vlib_time_now (vm);
- vm->time_offset = vlib_global_main.time_last_barrier_release - now;
+ vm->time_offset = vgm->vlib_mains[0]->time_last_barrier_release - now;
vm->time_last_barrier_release = vlib_time_now (vm);
}