diff options
author | Justin Husted <sigstop@gmail.com> | 2019-11-02 23:45:34 -0700 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-11-03 23:17:43 -0500 |
commit | b20e16073546a32f925f839c2b4bf4da770ec3f8 (patch) | |
tree | b289681732dd59db50c0560a7473bcf6bb23e4ea | |
parent | 36e4b3147e22143ffaa8caca56507d4ca9fb5aeb (diff) |
Stop the timer task at process exit time, to make valgrind happy.
Signed-off-by: Justin Husted <sigstop@gmail.com>
-rw-r--r-- | linux/timer.c | 26 |
1 files 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; } |