summaryrefslogtreecommitdiff
path: root/src/timer.c
diff options
context:
space:
mode:
authorGrissiom <[email protected]>2013-01-17 16:00:19 +0800
committerGrissiom <[email protected]>2013-01-17 16:13:01 +0800
commit0001344105054ed6c09184db96c1b04eb882fdd0 (patch)
tree7242bd486d7488b846232ddd4c417b1af3cd10eb /src/timer.c
parent250fd1082b193f3c4b2d1abe78f68de23e3c25ee (diff)
more deterministic on timer
If two timer will timeout at the same tick, the one started later will be called later. I've tested the patch on simulator and it _seems_ OK. Reported-by: xdzy on the forum and delin17 <[email protected]>
Diffstat (limited to 'src/timer.c')
-rw-r--r--src/timer.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/timer.c b/src/timer.c
index a1699dad63..2a27d9d9a8 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -273,12 +273,18 @@ rt_err_t rt_timer_start(rt_timer_t timer)
for (n = timer_list->next; n != timer_list; n = n->next)
{
t = rt_list_entry(n, struct rt_timer, list);
-
+
/*
* It supposes that the new tick shall less than the half duration of
- * tick max.
+ * tick max. And if we have two timers that timeout at the same time,
+ * it's prefered that the timer inserted early get called early.
*/
- if ((t->timeout_tick - timer->timeout_tick) < RT_TICK_MAX / 2)
+ if ((t->timeout_tick - timer->timeout_tick) == 0)
+ {
+ rt_list_insert_after(n, &(timer->list));
+ break;
+ }
+ else if ((t->timeout_tick - timer->timeout_tick) < RT_TICK_MAX / 2)
{
rt_list_insert_before(n, &(timer->list));
break;