Parcourir la source

Merge pull request #214 from grissiom/rtt-next2

Rtt next2
Bernard Xiong il y a 11 ans
Parent
commit
05d8045a24
3 fichiers modifiés avec 16 ajouts et 2 suppressions
  1. 1 0
      include/rtthread.h
  2. 5 2
      src/idle.c
  3. 10 0
      src/scheduler.c

+ 1 - 0
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));

+ 5 - 2
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 <rthw.h>
@@ -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;

+ 10 - 0
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 <rtthread.h>
@@ -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;
+}
 /*@}*/