diff options
Diffstat (limited to 'firmware/target/hosted')
-rw-r--r-- | firmware/target/hosted/kernel-unix.c | 16 |
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 | ||
114 | static void timer_cb(union sigval arg) | 114 | static 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 | } |