summaryrefslogtreecommitdiff
path: root/components/libc
diff options
context:
space:
mode:
Diffstat (limited to 'components/libc')
-rw-r--r--components/libc/posix/pthreads/pthread_barrier.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/components/libc/posix/pthreads/pthread_barrier.c b/components/libc/posix/pthreads/pthread_barrier.c
index f2c0e2d1c3..8802aaedbd 100644
--- a/components/libc/posix/pthreads/pthread_barrier.c
+++ b/components/libc/posix/pthreads/pthread_barrier.c
@@ -86,6 +86,30 @@ int pthread_barrier_destroy(pthread_barrier_t *barrier)
if (!barrier)
return EINVAL;
+ /* Lock the internal mutex to safely check the barrier's state*/
+ result = pthread_mutex_lock(&(barrier->mutex));
+ if (result != 0)
+ return result;
+
+ /* Check if any threads are currently waiting on the barrier*/
+ if (barrier->count != 0)
+ {
+ pthread_mutex_unlock(&(barrier->mutex));
+ return EBUSY; /* Threads are still waiting*/
+ }
+
+ /* Free resources associated with the barrier*/
+ result = pthread_mutex_unlock(&(barrier->mutex));
+ if (result != 0)
+ {
+ return result; /* Return mutex unlock error*/
+ }
+
+ result = pthread_mutex_destroy(&(barrier->mutex));
+ if (result != 0)
+ {
+ return result; /* Return mutex destroy error*/
+ }
result = pthread_cond_destroy(&(barrier->cond));
return result;