From e9a77b513f0a4b37d539a030592a61b08d03602d Mon Sep 17 00:00:00 2001 From: bernard Date: Fri, 29 Sep 2017 10:23:49 +0800 Subject: [PATCH] [Kernel] mutex can be used before scheduler startup. --- src/ipc.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/ipc.c b/src/ipc.c index 9ecd602099..f426ac60d7 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -644,16 +644,17 @@ rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time) register rt_base_t temp; struct rt_thread *thread; - /* this function must not be used in interrupt even if time = 0 */ - RT_DEBUG_IN_THREAD_CONTEXT; - RT_ASSERT(mutex != RT_NULL); - /* disable interrupt */ - temp = rt_hw_interrupt_disable(); - /* 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 */ + RT_DEBUG_IN_THREAD_CONTEXT; + + /* disable interrupt */ + temp = rt_hw_interrupt_disable(); RT_OBJECT_HOOK_CALL(rt_object_trytake_hook, (&(mutex->parent.parent))); @@ -777,11 +778,12 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex) need_schedule = RT_FALSE; - /* only thread could release mutex because we need test the ownership */ - RT_DEBUG_IN_THREAD_CONTEXT; - /* get current thread */ 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 */ temp = rt_hw_interrupt_disable();