diff options
Diffstat (limited to 'src/idle.c')
| -rw-r--r-- | src/idle.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/idle.c b/src/idle.c index 68b816f7ed..ecd894b8e2 100644 --- a/src/idle.c +++ b/src/idle.c @@ -25,6 +25,7 @@ * 2013-12-21 Grissiom let rt_thread_idle_excute loop until there is no * dead thread. * 2016-08-09 ArdaFu add method to get the handler of the idle thread. + * 2018-02-07 Bernard lock scheduler to protect tid->cleanup. */ #include <rthw.h> @@ -123,6 +124,10 @@ void rt_thread_idle_excute(void) #endif /* remove defunct thread */ rt_list_remove(&(thread->tlist)); + + /* lock scheduler to prevent scheduling in cleanup function. */ + rt_enter_critical(); + /* invoke thread cleanup */ if (thread->cleanup != RT_NULL) thread->cleanup(thread); @@ -134,11 +139,17 @@ void rt_thread_idle_excute(void) /* if it's a system object, not delete it */ if (rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE) { + /* unlock scheduler */ + rt_exit_critical(); + /* enable interrupt */ rt_hw_interrupt_enable(lock); return; } + + /* unlock scheduler */ + rt_exit_critical(); } else { |
