From b20e16073546a32f925f839c2b4bf4da770ec3f8 Mon Sep 17 00:00:00 2001 From: Justin Husted Date: Sat, 2 Nov 2019 23:45:34 -0700 Subject: [PATCH] Stop the timer task at process exit time, to make valgrind happy. Signed-off-by: Justin Husted --- linux/timer.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/linux/timer.c b/linux/timer.c index dd5aba18..11a2fd8d 100644 --- a/linux/timer.c +++ b/linux/timer.c @@ -244,6 +244,8 @@ out: return idx >= 0; } +static bool timer_thread_stop = false; + static int timer_thread(void *arg) { struct pending_timer *p; @@ -253,7 +255,7 @@ static int timer_thread(void *arg) pthread_mutex_lock(&timer_lock); - while (1) { + while (!timer_thread_stop) { now = jiffies; p = heap_peek(&pending_timers); @@ -295,14 +297,28 @@ static int timer_thread(void *arg) return 0; } +struct task_struct *timer_task; + __attribute__((constructor(103))) static void timers_init(void) { - struct task_struct *p; - heap_init(&pending_timers, 64); BUG_ON(!pending_timers.data); - p = kthread_run(timer_thread, NULL, "timers"); - BUG_ON(IS_ERR(p)); + timer_task = kthread_run(timer_thread, NULL, "timers"); + BUG_ON(IS_ERR(timer_task)); +} + +__attribute__((destructor(103))) +static void timers_cleanup(void) +{ + pthread_mutex_lock(&timer_lock); + timer_thread_stop = true; + pthread_cond_signal(&timer_cond); + pthread_mutex_unlock(&timer_lock); + + int ret = kthread_stop(timer_task); + BUG_ON(ret); + + timer_task = NULL; }