diff options
| author | Bernard Xiong <[email protected]> | 2020-08-17 14:19:43 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-08-17 14:19:43 +0800 |
| commit | 4ad8c75229dfb37c2ee529420c2b80c997a909b1 (patch) | |
| tree | 3d7f33f53ce4184942036fb07e5a6a3a5865188a /src/timer.c | |
| parent | ca85c64af76e5502734075906a16a2ed73a4f9b9 (diff) | |
| parent | 76d1651a7463eb4bdf1215bd28dd289647fd11eb (diff) | |
Merge pull request #3822 from geniusgogo/master
fixed the iterator failure for softtimer list timeout check.
Diffstat (limited to 'src/timer.c')
| -rw-r--r-- | src/timer.c | 17 |
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)); |
