summaryrefslogtreecommitdiff
path: root/src/thread.c
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2022-10-15 16:19:13 +0800
committerBernard Xiong <[email protected]>2022-10-15 16:19:13 +0800
commit34c77da153319da3225bd2064333b34942fee933 (patch)
tree2866795c124980a36e3258e2f0d3bb6888a1b5a9 /src/thread.c
parent8524e273e10a87724b4f86dfe8ae94e7cef6ca70 (diff)
[Kernel] Add nested mutex feature
Diffstat (limited to 'src/thread.c')
-rw-r--r--src/thread.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/thread.c b/src/thread.c
index df6de24275..9d37861c5a 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -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);