diff options
| author | yygg_you <[email protected]> | 2017-10-06 08:58:24 +0800 |
|---|---|---|
| committer | yygg_you <[email protected]> | 2017-10-06 08:58:24 +0800 |
| commit | 2e01bafa71dc0309abfca352edae8872d27038fc (patch) | |
| tree | a4208429d31866a5938ee6484ae25b525d0180d7 /src/ipc.c | |
| parent | ad1d3375f222c5746514ab16003dc18c0df83dad (diff) | |
| parent | a15d90a6865fa05e2420205556df7cece5f5c134 (diff) | |
Merge branch 'master' of https://github.com/yygg/rt-thread
Diffstat (limited to 'src/ipc.c')
| -rw-r--r-- | src/ipc.c | 34 |
1 files changed, 18 insertions, 16 deletions
@@ -644,17 +644,18 @@ rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time) register rt_base_t temp; 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 */ RT_DEBUG_IN_THREAD_CONTEXT; - RT_ASSERT(mutex != RT_NULL); - /* disable interrupt */ temp = rt_hw_interrupt_disable(); - /* get current thread */ - thread = rt_thread_self(); - RT_OBJECT_HOOK_CALL(rt_object_trytake_hook, (&(mutex->parent.parent))); RT_DEBUG_LOG(RT_DEBUG_IPC, @@ -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(); @@ -1382,8 +1384,8 @@ rt_err_t rt_mb_delete(rt_mailbox_t mb) else #endif - /* free mailbox pool */ - RT_KERNEL_FREE(mb->msg_pool); + /* free mailbox pool */ + RT_KERNEL_FREE(mb->msg_pool); /* delete mailbox object */ rt_object_delete(&(mb->parent.parent)); @@ -1775,7 +1777,7 @@ rt_err_t rt_mq_init(rt_mq_t mq, for (temp = 0; temp < mq->max_msgs; temp ++) { head = (struct rt_mq_message *)((rt_uint8_t *)mq->msg_pool + - temp * (mq->msg_size + sizeof(struct rt_mq_message))); + temp * (mq->msg_size + sizeof(struct rt_mq_message))); head->next = mq->msg_queue_free; mq->msg_queue_free = head; } @@ -1849,7 +1851,7 @@ rt_mq_t rt_mq_create(const char *name, mq->max_msgs = max_msgs; /* allocate message pool */ - mq->msg_pool = RT_KERNEL_MALLOC((mq->msg_size + sizeof(struct rt_mq_message))* mq->max_msgs); + mq->msg_pool = RT_KERNEL_MALLOC((mq->msg_size + sizeof(struct rt_mq_message)) * mq->max_msgs); if (mq->msg_pool == RT_NULL) { rt_mq_delete(mq); @@ -1866,7 +1868,7 @@ rt_mq_t rt_mq_create(const char *name, for (temp = 0; temp < mq->max_msgs; temp ++) { head = (struct rt_mq_message *)((rt_uint8_t *)mq->msg_pool + - temp * (mq->msg_size + sizeof(struct rt_mq_message))); + temp * (mq->msg_size + sizeof(struct rt_mq_message))); head->next = mq->msg_queue_free; mq->msg_queue_free = head; } @@ -1902,8 +1904,8 @@ rt_err_t rt_mq_delete(rt_mq_t mq) else #endif - /* free message queue pool */ - RT_KERNEL_FREE(mq->msg_pool); + /* free message queue pool */ + RT_KERNEL_FREE(mq->msg_pool); /* delete message queue object */ rt_object_delete(&(mq->parent.parent)); @@ -1942,7 +1944,7 @@ rt_err_t rt_mq_send(rt_mq_t mq, void *buffer, rt_size_t size) temp = rt_hw_interrupt_disable(); /* get a free list, there must be an empty item */ - msg = (struct rt_mq_message*)mq->msg_queue_free; + msg = (struct rt_mq_message *)mq->msg_queue_free; /* message queue is full */ if (msg == RT_NULL) { |
