From: Quentin Young Date: Fri, 9 Jun 2017 18:10:59 +0000 (+0000) Subject: bgpd: use stop event instead of pthread_kill() X-Git-Tag: frr-4.0-dev~120^2~33 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=48e5262f64d8f6ef51934976dea3064d8395729b;p=matthieu%2Ffrr.git 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 --- 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;