diff options
author | Dave Barach <dave@barachs.net> | 2017-10-13 19:16:56 -0400 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2017-10-14 09:08:41 +0000 |
commit | 903651caf320dfdaabd20a0e6f3cd0ffc843e02f (patch) | |
tree | 2a747a9ea4398e73d5695989f4b0c807b4ff93a8 /src/vlib/main.h | |
parent | f9342023c19887da656133e2688a90d70383b0c5 (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>
Diffstat (limited to 'src/vlib/main.h')
-rw-r--r-- | src/vlib/main.h | 5 |
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 |