From bb0a1ea45350986d14e985b1ba0de9c1ec7a650d Mon Sep 17 00:00:00 2001 From: ligr Date: Thu, 21 Nov 2024 11:16:21 +0800 Subject: [PATCH] [components/libc/posix]fix the problem that it doesn't check if barrier still in use and dosen't destory the mutex either. --- .../libc/posix/pthreads/pthread_barrier.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) 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;