summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Husted <sigstop@gmail.com>2019-11-02 23:45:34 -0700
committerKent Overstreet <kent.overstreet@gmail.com>2019-11-03 23:17:43 -0500
commitb20e16073546a32f925f839c2b4bf4da770ec3f8 (patch)
treeb289681732dd59db50c0560a7473bcf6bb23e4ea
parent36e4b3147e22143ffaa8caca56507d4ca9fb5aeb (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.c26
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;
}