Browse Source

[Kernel] mutex can be used before scheduler startup.

bernard 7 years ago
parent
commit
e9a77b513f
1 changed files with 10 additions and 8 deletions
  1. 10 8
      src/ipc.c

+ 10 - 8
src/ipc.c

@@ -644,17 +644,18 @@ rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time)
     register rt_base_t temp;
     register rt_base_t temp;
     struct rt_thread *thread;
     struct rt_thread *thread;
 
 
+    RT_ASSERT(mutex != RT_NULL);
+
+    /* get current thread */
+    thread = rt_thread_self();
+    if (!thread) return RT_EOK; /* return directory if scheduler not started */
+
     /* this function must not be used in interrupt even if time = 0 */
     /* this function must not be used in interrupt even if time = 0 */
     RT_DEBUG_IN_THREAD_CONTEXT;
     RT_DEBUG_IN_THREAD_CONTEXT;
 
 
-    RT_ASSERT(mutex != RT_NULL);
-
     /* disable interrupt */
     /* disable interrupt */
     temp = rt_hw_interrupt_disable();
     temp = rt_hw_interrupt_disable();
 
 
-    /* get current thread */
-    thread = rt_thread_self();
-
     RT_OBJECT_HOOK_CALL(rt_object_trytake_hook, (&(mutex->parent.parent)));
     RT_OBJECT_HOOK_CALL(rt_object_trytake_hook, (&(mutex->parent.parent)));
 
 
     RT_DEBUG_LOG(RT_DEBUG_IPC,
     RT_DEBUG_LOG(RT_DEBUG_IPC,
@@ -777,11 +778,12 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
 
 
     need_schedule = RT_FALSE;
     need_schedule = RT_FALSE;
 
 
-    /* only thread could release mutex because we need test the ownership */
-    RT_DEBUG_IN_THREAD_CONTEXT;
-
     /* get current thread */
     /* get current thread */
     thread = rt_thread_self();
     thread = rt_thread_self();
+    if (!thread) return RT_EOK;
+
+    /* only thread could release mutex because we need test the ownership */
+    RT_DEBUG_IN_THREAD_CONTEXT;
 
 
     /* disable interrupt */
     /* disable interrupt */
     temp = rt_hw_interrupt_disable();
     temp = rt_hw_interrupt_disable();