diff --git a/components/libc/pthreads/pthread_mutex.c b/components/libc/pthreads/pthread_mutex.c index 40fd870e81..3a3fbe61e5 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); -