vlib: multiarch vlib_frame_queue_dequeue()
[vpp.git] / src / vlib / threads.h
index eb31edc..9d9d387 100644 (file)
@@ -19,8 +19,6 @@
 #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 * */
@@ -181,9 +179,6 @@ int vlib_frame_queue_enqueue (vlib_main_t * vm, u32 node_runtime_index,
                              u32 frame_queue_index, vlib_frame_t * frame,
                              vlib_frame_queue_msg_type_t type);
 
-int
-vlib_frame_queue_dequeue (vlib_main_t * vm, vlib_frame_queue_main_t * fqm);
-
 void vlib_worker_thread_node_runtime_update (void);
 
 void vlib_create_worker_threads (vlib_main_t * vm, int n,
@@ -231,36 +226,24 @@ vlib_smp_unsafe_warning (void)
     }
 }
 
-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") \
@@ -402,6 +385,7 @@ vlib_worker_thread_barrier_check (void)
 {
   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);
@@ -425,8 +409,7 @@ vlib_worker_thread_barrier_check (void)
            u32 thread_index;
          } __clib_packed *ed;
 
-         ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e,
-                               w->elog_track);
+         ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e, w->elog_track);
          ed->thread_index = thread_index;
        }
 
@@ -449,7 +432,7 @@ vlib_worker_thread_barrier_check (void)
        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);
       }
 
@@ -503,8 +486,7 @@ vlib_worker_thread_barrier_check (void)
            u32 duration;
          } __clib_packed *ed;
 
-         ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e,
-                               w->elog_track);
+         ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e, w->elog_track);
          ed->thread_index = thread_index;
          ed->duration = (int) (1000000.0 * t);
        }