From d4080a4058c71c4e13012e6cfbf3f218de5dca59 Mon Sep 17 00:00:00 2001 From: Peter Bee Date: Thu, 21 Jan 2021 15:41:10 +0800 Subject: [PATCH] libc/pthread: return EBUSY when barrier is in use MIRTOS-114 Add check for semcount==0 before barrier destroy and initialization Change-Id: Ifa0cdb363714ad15eafa5ef49a025520ce836b1f Signed-off-by: Peter Bee --- libs/libc/pthread/pthread_barrierdestroy.c | 13 +++++++++++-- libs/libc/pthread/pthread_barrierinit.c | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/libs/libc/pthread/pthread_barrierdestroy.c b/libs/libc/pthread/pthread_barrierdestroy.c index ca10b652afd..c9192e485ca 100644 --- a/libs/libc/pthread/pthread_barrierdestroy.c +++ b/libs/libc/pthread/pthread_barrierdestroy.c @@ -77,6 +77,7 @@ int pthread_barrier_destroy(FAR pthread_barrier_t *barrier) { int ret = OK; + int semcount; if (!barrier) { @@ -84,8 +85,16 @@ int pthread_barrier_destroy(FAR pthread_barrier_t *barrier) } else { - sem_destroy(&barrier->sem); - barrier->count = 0; + nxsem_get_value(&barrier->sem, &semcount); + if (semcount == 0) + { + sem_destroy(&barrier->sem); + barrier->count = 0; + } + else + { + ret = EBUSY; + } } return ret; diff --git a/libs/libc/pthread/pthread_barrierinit.c b/libs/libc/pthread/pthread_barrierinit.c index 0590feff342..e39a77d9ff0 100644 --- a/libs/libc/pthread/pthread_barrierinit.c +++ b/libs/libc/pthread/pthread_barrierinit.c @@ -88,6 +88,7 @@ int pthread_barrier_init(FAR pthread_barrier_t *barrier, FAR const pthread_barrierattr_t *attr, unsigned int count) { int ret = OK; + int semcount; if (!barrier || count == 0) { @@ -95,8 +96,16 @@ int pthread_barrier_init(FAR pthread_barrier_t *barrier, } else { - sem_init(&barrier->sem, 0, 0); - barrier->count = count; + nxsem_get_value(&barrier->sem, &semcount); + if (semcount == 0) + { + sem_init(&barrier->sem, 0, 0); + barrier->count = count; + } + else + { + ret = EBUSY; + } } return ret;