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;