summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxieyangrun <[email protected]>2020-08-15 20:15:29 +0800
committerxieyangrun <[email protected]>2020-08-15 20:15:29 +0800
commit76d1651a7463eb4bdf1215bd28dd289647fd11eb (patch)
treed222e861f58c584b4f52f5cf7d94a3b7caa4927b
parent5b94c1482e8e63f68ad2437cacf2e60e6737626a (diff)
fixed the iterator failure for softtimer list timeout check.
-rw-r--r--src/timer.c17
1 files changed, 5 insertions, 12 deletions
diff --git a/src/timer.c b/src/timer.c
index 4d12c7ec78..52707f2306 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -595,20 +595,19 @@ rt_tick_t rt_timer_next_timeout_tick(void)
void rt_soft_timer_check(void)
{
rt_tick_t current_tick;
- rt_list_t *n;
struct rt_timer *t;
RT_DEBUG_LOG(RT_DEBUG_TIMER, ("software timer check enter\n"));
- current_tick = rt_tick_get();
-
/* lock scheduler */
rt_enter_critical();
- for (n = rt_soft_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1].next;
- n != &(rt_soft_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1]);)
+ while (!rt_list_isempty(&rt_soft_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1]))
{
- t = rt_list_entry(n, struct rt_timer, row[RT_TIMER_SKIP_LIST_LEVEL - 1]);
+ t = rt_list_entry(rt_soft_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1].next,
+ struct rt_timer, row[RT_TIMER_SKIP_LIST_LEVEL - 1]);
+
+ current_tick = rt_tick_get();
/*
* It supposes that the new tick shall less than the half duration of
@@ -618,9 +617,6 @@ void rt_soft_timer_check(void)
{
RT_OBJECT_HOOK_CALL(rt_timer_enter_hook, (t));
- /* move node to the next */
- n = n->next;
-
/* remove timer from timer list firstly */
_rt_timer_remove(t);
@@ -629,9 +625,6 @@ void rt_soft_timer_check(void)
/* call timeout function */
t->timeout_func(t->parameter);
- /* re-get tick */
- current_tick = rt_tick_get();
-
RT_OBJECT_HOOK_CALL(rt_timer_exit_hook, (t));
RT_DEBUG_LOG(RT_DEBUG_TIMER, ("current tick: %d\n", current_tick));