From a46134c144bdb52bbc1e47b7cb4b2ba742678d4e Mon Sep 17 00:00:00 2001 From: "jc_.kim" Date: Wed, 31 May 2017 09:34:52 +0900 Subject: [PATCH] Fix a problem in pthread_trylock() When CONFIG_PTHREAD_MUTEX_UNSAFE=y, the special return value EAGAIN was not being detected due to differences in reporting of returned values. --- os/kernel/pthread/pthread.h | 5 ++++- os/kernel/pthread/pthread_initialize.c | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/os/kernel/pthread/pthread.h b/os/kernel/pthread/pthread.h index 1793cf0..eda3bea 100644 --- a/os/kernel/pthread/pthread.h +++ b/os/kernel/pthread/pthread.h @@ -122,6 +122,9 @@ void pthread_destroyjoin(FAR struct task_group_s *group, FAR struct join_s *pjoi FAR struct join_s *pthread_findjoininfo(FAR struct task_group_s *group, pid_t pid); void pthread_release(FAR struct task_group_s *group); int pthread_takesemaphore(sem_t *sem, bool intr); +#ifdef CONFIG_PTHREAD_MUTEX_UNSAFE +int pthread_sem_trytake(sem_t *sem); +#endif int pthread_givesemaphore(sem_t *sem); #ifndef CONFIG_PTHREAD_MUTEX_UNSAFE @@ -131,7 +134,7 @@ int pthread_mutex_give(FAR struct pthread_mutex_s *mutex); void pthread_mutex_inconsistent(FAR struct pthread_tcb_s *tcb); #else #define pthread_mutex_take(m,i) pthread_takesemaphore(&(m)->sem,(i)) -#define pthread_mutex_trytake(m) sem_trywait(&(m)->sem) +#define pthread_mutex_trytake(m) pthread_sem_trytake(&(m)->sem) #define pthread_mutex_give(m) pthread_givesemaphore(&(m)->sem) #endif diff --git a/os/kernel/pthread/pthread_initialize.c b/os/kernel/pthread/pthread_initialize.c index 84336ce..a5faf40 100644 --- a/os/kernel/pthread/pthread_initialize.c +++ b/os/kernel/pthread/pthread_initialize.c @@ -157,6 +157,25 @@ int pthread_takesemaphore(sem_t *sem, bool intr) } } +#ifdef CONFIG_PTHREAD_MUTEX_UNSAFE +int pthread_sem_trytake(sem_t *sem) +{ + int ret = EINVAL; + + /* Verify input parameters */ + + DEBUGASSERT(sem != NULL); + if (sem != NULL) { + /* Try to take the semaphore */ + + int status = sem_trywait(sem); + ret = status < 0 ? get_errno() : OK; + } + + return ret; +} +#endif + int pthread_givesemaphore(sem_t *sem) { /* Verify input parameters */ -- 2.7.4