summaryrefslogtreecommitdiffstats
path: root/src/vlib/main.h
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2017-10-13 19:16:56 -0400
committerFlorin Coras <florin.coras@gmail.com>2017-10-16 02:33:49 +0000
commit84db40e02e74efabe094e0d46ed2fafd348d126d (patch)
treeacb97b6c2274bfdb45770347a6033b68ebff0545 /src/vlib/main.h
parentb5518bedd95bea9c30cebcd5b0db76bd00f30a80 (diff)
VPP-1029: Don't call clib_longjmp(...) directly from the SIGTERM handler
It's way too easy to imagine leaving a mutex or a spin-lock held in the /vpe-api shared-memory segment, or elsewhere. Set a volatile variable and check it in a safe place... Change-Id: I9d91c38cffeb921143c272162d055c9c24a6c312 Signed-off-by: Dave Barach <dave@barachs.net> (cherry picked from commit 903651caf320dfdaabd20a0e6f3cd0ffc843e02f)
Diffstat (limited to 'src/vlib/main.h')
-rw-r--r--src/vlib/main.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/vlib/main.h b/src/vlib/main.h
index fb67334e4e2..4288d6f0388 100644
--- a/src/vlib/main.h
+++ b/src/vlib/main.h
@@ -85,6 +85,8 @@ typedef struct vlib_main_t
/* Jump target to exit main loop with given code. */
u32 main_loop_exit_set;
+ /* Set e.g. in the SIGTERM signal handler, checked in a safe place... */
+ volatile u32 main_loop_exit_now;
clib_longjmp_t main_loop_exit;
#define VLIB_MAIN_LOOP_EXIT_NONE 0
#define VLIB_MAIN_LOOP_EXIT_PANIC 1
@@ -340,6 +342,9 @@ vlib_increment_main_loop_counter (vlib_main_t * vm)
vm->main_loop_nodes_processed = 0;
vm->vector_counts_per_main_loop[i] = v;
vm->node_counts_per_main_loop[i] = n;
+
+ if (PREDICT_FALSE (vm->main_loop_exit_now))
+ clib_longjmp (&vm->main_loop_exit, VLIB_MAIN_LOOP_EXIT_CLI);
}
always_inline void vlib_set_queue_signal_callback