diff options
author | Florin Coras <fcoras@cisco.com> | 2018-12-02 12:45:53 -0800 |
---|---|---|
committer | Florin Coras <fcoras@cisco.com> | 2018-12-04 07:21:56 -0800 |
commit | 01f3f894fc180060ef8ee1c8b4acb4421d12ebe3 (patch) | |
tree | bf91c13aa0f17db7a3801c38c14017846aab32b2 /src/vcl/vcl_private.c | |
parent | a5fb0ec6c3b19c5fe74f171297afe68be897548c (diff) |
vcl: cleanup children that use _exit()
Change-Id: Ia56c2698adb0ea7811203844dc4db10e121fbc42
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vcl/vcl_private.c')
-rw-r--r-- | src/vcl/vcl_private.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/vcl/vcl_private.c b/src/vcl/vcl_private.c index 673b91d4576..d82a7ff3355 100644 --- a/src/vcl/vcl_private.c +++ b/src/vcl/vcl_private.c @@ -211,6 +211,7 @@ vcl_worker_alloc (void) pool_get (vcm->workers, wrk); memset (wrk, 0, sizeof (*wrk)); wrk->wrk_index = wrk - vcm->workers; + wrk->forked_child = ~0; return wrk; } @@ -221,13 +222,16 @@ vcl_worker_free (vcl_worker_t * wrk) } void -vcl_worker_cleanup (u8 notify_vpp) +vcl_worker_cleanup (vcl_worker_t * wrk, u8 notify_vpp) { - vcl_worker_t *wrk = vcl_worker_get_current (); - clib_spinlock_lock (&vcm->workers_lock); if (notify_vpp) - vcl_send_app_worker_add_del (0 /* is_add */ ); + { + if (wrk->wrk_index == vcl_get_worker_index ()) + vcl_send_app_worker_add_del (0 /* is_add */ ); + else + vcl_send_child_worker_del (wrk); + } if (wrk->mqs_epfd > 0) close (wrk->mqs_epfd); hash_free (wrk->session_index_by_vpp_handles); @@ -235,7 +239,6 @@ vcl_worker_cleanup (u8 notify_vpp) clib_spinlock_free (&wrk->ct_registration_lock); vec_free (wrk->mq_events); vec_free (wrk->mq_msg_vector); - vcl_set_worker_index (~0); vcl_worker_free (wrk); clib_spinlock_unlock (&vcm->workers_lock); } @@ -243,8 +246,10 @@ vcl_worker_cleanup (u8 notify_vpp) static void vcl_worker_cleanup_cb (void *arg) { - u32 wrk_index = vcl_get_worker_index (); - vcl_worker_cleanup (1 /* notify vpp */ ); + vcl_worker_t *wrk = vcl_worker_get_current (); + u32 wrk_index = wrk->wrk_index; + vcl_worker_cleanup (wrk, 1 /* notify vpp */ ); + vcl_set_worker_index (~0); VDBG (0, "cleaned up worker %u", wrk_index); } @@ -309,7 +314,6 @@ vcl_worker_register_with_vpp (void) clib_warning ("failed to add worker to vpp"); return -1; } - if (pthread_key_create (&vcl_worker_stop_key, vcl_worker_cleanup_cb)) clib_warning ("failed to add pthread cleanup function"); if (pthread_setspecific (vcl_worker_stop_key, &wrk->thread_id)) @@ -414,12 +418,11 @@ vcl_worker_unshare_session (vcl_worker_t * wrk, vcl_session_t * s) } void -vcl_worker_share_sessions (u32 parent_wrk_index) +vcl_worker_share_sessions (vcl_worker_t * parent_wrk) { - vcl_worker_t *parent_wrk, *wrk; vcl_session_t *new_s; + vcl_worker_t *wrk; - parent_wrk = vcl_worker_get (parent_wrk_index); if (!parent_wrk->sessions) return; |