From 712c0673fbe9a5fa6b23f07ff58ea7dbdc6d4347 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 3 Nov 2016 15:38:51 +0800 Subject: [PATCH] [pthreads] Fix the phread_mutex_trylock issue for not recursive mutex. --- components/libc/pthreads/pthread_mutex.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/components/libc/pthreads/pthread_mutex.c b/components/libc/pthreads/pthread_mutex.c index 40fd870e8..3a3fbe61e 100644 --- a/components/libc/pthreads/pthread_mutex.c +++ b/components/libc/pthreads/pthread_mutex.c @@ -232,6 +232,7 @@ RTM_EXPORT(pthread_mutex_unlock); int pthread_mutex_trylock(pthread_mutex_t *mutex) { rt_err_t result; + int mtype; if (!mutex) return EINVAL; @@ -241,11 +242,20 @@ int pthread_mutex_trylock(pthread_mutex_t *mutex) pthread_mutex_init(mutex, RT_NULL); } + mtype = mutex->attr & MUTEXATTR_TYPE_MASK; + rt_enter_critical(); + if (mutex->lock.owner == rt_thread_self() && + mtype != PTHREAD_MUTEX_RECURSIVE) + { + rt_exit_critical(); + + return EDEADLK; + } + rt_exit_critical(); + result = rt_mutex_take(&(mutex->lock), 0); - if (result == RT_EOK) - return 0; + if (result == RT_EOK) return 0; return EBUSY; } RTM_EXPORT(pthread_mutex_trylock); -