mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-10-07 00:59:00 +08:00
Merge pull request #6523 from BernardXiong/nested_mutex
[Kernel] Add nested mutex feature
This commit is contained in:
@@ -411,9 +411,9 @@ long list_mutex(void)
|
||||
|
||||
maxlen = RT_NAME_MAX;
|
||||
|
||||
rt_kprintf("%-*.s owner hold suspend thread\n", maxlen, item_title);
|
||||
rt_kprintf("%-*.s owner hold suspend thread priority\n", maxlen, item_title);
|
||||
object_split(maxlen);
|
||||
rt_kprintf(" -------- ---- --------------\n");
|
||||
rt_kprintf(" -------- ---- -------------- --------\n");
|
||||
|
||||
do
|
||||
{
|
||||
@@ -436,13 +436,14 @@ long list_mutex(void)
|
||||
rt_hw_interrupt_enable(level);
|
||||
|
||||
m = (struct rt_mutex *)obj;
|
||||
rt_kprintf("%-*.*s %-8.*s %04d %d\n",
|
||||
rt_kprintf("%-*.*s %-8.*s %04d %d %d\n",
|
||||
maxlen, RT_NAME_MAX,
|
||||
m->parent.parent.name,
|
||||
RT_NAME_MAX,
|
||||
m->owner->name,
|
||||
m->hold,
|
||||
rt_list_len(&m->parent.suspend_thread));
|
||||
rt_list_len(&m->parent.suspend_thread),
|
||||
m->priority);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+11
-3
@@ -673,12 +673,19 @@ struct rt_thread
|
||||
|
||||
/* priority */
|
||||
rt_uint8_t current_priority; /**< current priority */
|
||||
rt_uint8_t init_priority; /**< initialized priority */
|
||||
#if RT_THREAD_PRIORITY_MAX > 32
|
||||
rt_uint8_t number;
|
||||
rt_uint8_t high_mask;
|
||||
#endif /* RT_THREAD_PRIORITY_MAX > 32 */
|
||||
rt_uint32_t number_mask;
|
||||
|
||||
#ifdef RT_USING_MUTEX
|
||||
/* object for IPC */
|
||||
rt_list_t taken_object_list;
|
||||
rt_object_t pending_object;
|
||||
#endif
|
||||
|
||||
#ifdef RT_USING_EVENT
|
||||
/* thread event */
|
||||
rt_uint32_t event_set;
|
||||
@@ -772,12 +779,13 @@ struct rt_mutex
|
||||
{
|
||||
struct rt_ipc_object parent; /**< inherit from ipc_object */
|
||||
|
||||
rt_uint16_t value; /**< value of mutex */
|
||||
|
||||
rt_uint8_t original_priority; /**< priority of last thread hold the mutex */
|
||||
rt_uint8_t ceiling_priority; /**< the priority ceiling of mutexe */
|
||||
rt_uint8_t priority; /**< the maximal priority for pending thread */
|
||||
rt_uint8_t hold; /**< numbers of thread hold the mutex */
|
||||
rt_uint8_t reserved; /**< reserved field */
|
||||
|
||||
struct rt_thread *owner; /**< current owner of mutex */
|
||||
rt_list_t taken_list; /**< the object list taken by thread */
|
||||
};
|
||||
typedef struct rt_mutex *rt_mutex_t;
|
||||
#endif /* RT_USING_MUTEX */
|
||||
|
||||
@@ -368,6 +368,9 @@ rt_err_t rt_mutex_detach(rt_mutex_t mutex);
|
||||
rt_mutex_t rt_mutex_create(const char *name, rt_uint8_t flag);
|
||||
rt_err_t rt_mutex_delete(rt_mutex_t mutex);
|
||||
#endif
|
||||
void rt_mutex_drop_thread(rt_mutex_t mutex, rt_thread_t thread);
|
||||
rt_uint8_t rt_mutex_setprioceiling(rt_mutex_t mutex, rt_uint8_t priority);
|
||||
rt_uint8_t rt_mutex_getprioceiling(rt_mutex_t mutex);
|
||||
|
||||
rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t timeout);
|
||||
rt_err_t rt_mutex_trytake(rt_mutex_t mutex);
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
* 2021-12-27 Meco Man remove .init_priority
|
||||
* 2022-01-07 Gabriel Moving __on_rt_xxxxx_hook to thread.c
|
||||
* 2022-01-24 THEWON let rt_thread_sleep return thread->error when using signal
|
||||
* 2022-10-15 Bernard add nested mutex feature
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
@@ -187,10 +188,16 @@ static rt_err_t _thread_init(struct rt_thread *thread,
|
||||
|
||||
/* priority init */
|
||||
RT_ASSERT(priority < RT_THREAD_PRIORITY_MAX);
|
||||
thread->init_priority = priority;
|
||||
thread->current_priority = priority;
|
||||
|
||||
thread->number_mask = 0;
|
||||
|
||||
#ifdef RT_USING_MUTEX
|
||||
rt_list_init(&thread->taken_object_list);
|
||||
thread->pending_object = RT_NULL;
|
||||
#endif
|
||||
|
||||
#ifdef RT_USING_EVENT
|
||||
thread->event_set = 0;
|
||||
thread->event_info = 0;
|
||||
@@ -420,6 +427,16 @@ rt_err_t rt_thread_detach(rt_thread_t thread)
|
||||
/* change stat */
|
||||
thread->stat = RT_THREAD_CLOSE;
|
||||
|
||||
#ifdef RT_USING_MUTEX
|
||||
if ((thread->pending_object) &&
|
||||
(rt_object_get_type(thread->pending_object) == RT_Object_Class_Mutex))
|
||||
{
|
||||
struct rt_mutex *mutex = (struct rt_mutex*)thread->pending_object;
|
||||
rt_mutex_drop_thread(mutex, thread);
|
||||
thread->pending_object = RT_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* insert to defunct thread list */
|
||||
rt_thread_defunct_enqueue(thread);
|
||||
|
||||
@@ -523,6 +540,16 @@ rt_err_t rt_thread_delete(rt_thread_t thread)
|
||||
/* change stat */
|
||||
thread->stat = RT_THREAD_CLOSE;
|
||||
|
||||
#ifdef RT_USING_MUTEX
|
||||
if ((thread->pending_object) &&
|
||||
(rt_object_get_type(thread->pending_object) == RT_Object_Class_Mutex))
|
||||
{
|
||||
struct rt_mutex *mutex = (struct rt_mutex*)thread->pending_object;
|
||||
rt_mutex_drop_thread(mutex, thread);
|
||||
thread->pending_object = RT_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* insert to defunct thread list */
|
||||
rt_thread_defunct_enqueue(thread);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user