summaryrefslogtreecommitdiff
path: root/firmware/target/hosted
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/hosted')
-rw-r--r--firmware/target/hosted/kernel-unix.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/firmware/target/hosted/kernel-unix.c b/firmware/target/hosted/kernel-unix.c
index e3c492a8cc..ed1f83cd8c 100644
--- a/firmware/target/hosted/kernel-unix.c
+++ b/firmware/target/hosted/kernel-unix.c
@@ -113,8 +113,8 @@ void (*global_timer_callback)(void);
113 113
114static void timer_cb(union sigval arg) 114static void timer_cb(union sigval arg)
115{ 115{
116 (void)arg; 116 /* check for spurious callbacks [arg.sival_ptr] */
117 if (global_timer_callback) 117 if (global_timer_callback && global_timer_callback == arg.sival_ptr)
118 global_timer_callback(); 118 global_timer_callback();
119} 119}
120 120
@@ -129,12 +129,18 @@ bool timer_register(int reg_prio, void (*unregister_callback)(void),
129 if (reg_prio <= timer_prio || in_us <= 0) 129 if (reg_prio <= timer_prio || in_us <= 0)
130 return false; 130 return false;
131 131
132 if (timer_prio >= 0 && global_unreg_callback) 132 if(timer_prio >= 0)
133 global_unreg_callback(); 133 {
134 if (global_unreg_callback) /* timer has callback user needs to unreg */
135 global_unreg_callback();
136 else /* no callback -- delete timer */
137 timer_delete(timer_tid);
138 }
134 139
135 memset(&sigev, 0, sizeof(sigevent_t)); 140 memset(&sigev, 0, sizeof(sigevent_t));
136 sigev.sigev_notify = SIGEV_THREAD, 141 sigev.sigev_notify = SIGEV_THREAD,
137 sigev.sigev_notify_function = timer_cb; 142 sigev.sigev_notify_function = timer_cb;
143 sigev.sigev_value.sival_ptr = timer_callback; /* store cb to check later */
138 144
139 div_t q = div(in_us, 1000000); 145 div_t q = div(in_us, 1000000);
140 ts.it_value.tv_sec = ts.it_interval.tv_sec = q.quot; 146 ts.it_value.tv_sec = ts.it_interval.tv_sec = q.quot;
@@ -166,4 +172,6 @@ void timer_unregister(void)
166{ 172{
167 timer_delete(timer_tid); 173 timer_delete(timer_tid);
168 timer_prio = -1; 174 timer_prio = -1;
175 global_unreg_callback = NULL;
176 global_timer_callback = NULL;
169} 177}