From 408ac34bc2d762db7019a14cc5caf8af4df57b43 Mon Sep 17 00:00:00 2001 From: Grissiom Date: Sat, 21 Dec 2013 11:24:37 +0800 Subject: [PATCH 1/2] kernel: add rt_critical_level that return the lock count of scheduler Out side world may be interested in whether the scheduler is locked or not. Provide an API to tell that. --- include/rtthread.h | 1 + src/scheduler.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/include/rtthread.h b/include/rtthread.h index b68a301a5c..0891ed9bcc 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -173,6 +173,7 @@ void rt_schedule_remove_thread(struct rt_thread *thread); void rt_enter_critical(void); void rt_exit_critical(void); +rt_uint16_t rt_critical_level(void); #ifdef RT_USING_HOOK void rt_scheduler_sethook(void (*hook)(rt_thread_t from, rt_thread_t to)); diff --git a/src/scheduler.c b/src/scheduler.c index cefc5b8c41..a0384e899a 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -34,6 +34,7 @@ * issue found by kuronca * 2010-12-13 Bernard add defunct list initialization even if not use heap. * 2011-05-10 Bernard clean scheduler debug log. + * 2013-12-21 Grissiom add rt_critical_level */ #include @@ -398,5 +399,14 @@ void rt_exit_critical(void) } } +/** + * Get the scheduler lock level + * + * @return the level of the scheduler lock. 0 means unlocked. + */ +rt_uint16_t rt_critical_level(void) +{ + return rt_scheduler_lock_nest; +} /*@}*/ From 04f432f47b906e129209daf8e505ac0f6b57ebd0 Mon Sep 17 00:00:00 2001 From: Grissiom Date: Sat, 21 Dec 2013 11:31:40 +0800 Subject: [PATCH 2/2] kernel: let rt_thread_idle_excute loop until there is no dead thread Out side world is difficult to tell whethere there is dead thread remaining. If rt_thread_idle_excute only do one cleanup, it's hard to finish cleanups outside the idle thread. So let is loop and do all the cleanups in one call. --- src/idle.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/idle.c b/src/idle.c index ff3fde21c5..7bca6c28cb 100644 --- a/src/idle.c +++ b/src/idle.c @@ -22,6 +22,8 @@ * 2006-03-23 Bernard the first version * 2010-11-10 Bernard add cleanup callback function in thread exit. * 2012-12-29 Bernard fix compiling warning. + * 2013-12-21 Grissiom let rt_thread_idle_excute loop until there is no + * dead thread. */ #include @@ -72,8 +74,9 @@ void rt_thread_idle_sethook(void (*hook)(void)) */ void rt_thread_idle_excute(void) { - /* check the defunct thread list */ - if (!rt_list_isempty(&rt_thread_defunct)) + /* Loop until there is no dead thread. So one call to rt_thread_idle_excute + * will do all the cleanups. */ + while (!rt_list_isempty(&rt_thread_defunct)) { rt_base_t lock; rt_thread_t thread;