From 48e5262f64d8f6ef51934976dea3064d8395729b Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Fri, 9 Jun 2017 18:10:59 +0000 Subject: [PATCH] bgpd: use stop event instead of pthread_kill() When terminating I/O thread, just schedule an event to do any necessary cleanup and gracefully exit instead of using a signal. Signed-off-by: Quentin Young --- bgpd/bgp_io.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/bgpd/bgp_io.c b/bgpd/bgp_io.c index eed310dec9..4369ef7a84 100644 --- a/bgpd/bgp_io.c +++ b/bgpd/bgp_io.c @@ -84,14 +84,23 @@ void *bgp_io_start(void *arg) return NULL; } +static int bgp_io_finish(struct thread *thread) +{ + /* if we ever have resources to clean up, that code should be placed in + * a pthread_cleanup handler and called from here */ + + /* set stop flag */ + atomic_store_explicit(&bgp_io_thread_run, false, memory_order_relaxed); + + return 0; +} + int bgp_io_stop(void **result, struct frr_pthread *fpt) { + /* schedule stop job */ + thread_add_event(fpt->master, &bgp_io_finish, NULL, 0, NULL); - bgp_io_thread_run = false; - /* let the loop break */ - fpt->master->spin = false; - /* break poll */ - pthread_kill(fpt->thread, SIGINT); + /* join */ pthread_join(fpt->thread, result); return 0; -- 2.39.5