aboutsummaryrefslogtreecommitdiffstats
path: root/src/vcl/vcl_private.c
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2018-12-02 12:45:53 -0800
committerFlorin Coras <fcoras@cisco.com>2018-12-04 07:21:56 -0800
commit01f3f894fc180060ef8ee1c8b4acb4421d12ebe3 (patch)
treebf91c13aa0f17db7a3801c38c14017846aab32b2 /src/vcl/vcl_private.c
parenta5fb0ec6c3b19c5fe74f171297afe68be897548c (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.c25
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;