/* A busy mutex can't be destroyed -> EBUSY */ static WINPTHREADS_ATTRIBUTE((noinline)) int mutex_ref_destroy (pthread_mutex_t *m, pthread_mutex_t *mDestroy ) { int r = 0; *mDestroy = NULL; /* also considered as busy, any concurrent access prevents destruction: $$$$ */ if (_spin_lite_trylock (&mutex_global) != 0) return EBUSY; if (!m || !*m) r = EINVAL; else { mutex_t *m_ = (mutex_t *)*m; if (STATIC_INITIALIZER(*m)) *m = NULL; else if (m_->valid != LIFE_MUTEX) r = EINVAL; else if (m_->busy || COND_LOCKED(m_)) r = EBUSY; else { *mDestroy = *m; *m = NULL; } } _spin_lite_unlock (&mutex_global); return r; }
static WINPTHREADS_ATTRIBUTE((noinline)) int barrier_ref_destroy(volatile pthread_barrier_t *barrier, pthread_barrier_t *bDestroy) { int r = 0; *bDestroy = NULL; if (_spin_lite_trylock(&barrier_global)) return EBUSY; if (!barrier || !*barrier || ((barrier_t *)*barrier)->valid != LIFE_BARRIER) r = EINVAL; else { barrier_t *b_ = (barrier_t *)*barrier; if (b_->busy) r = EBUSY; else { *bDestroy = *barrier; *barrier = NULL; } } _spin_lite_unlock(&barrier_global); return r; }
static __attribute__((noinline)) int rwl_ref_destroy(pthread_rwlock_t *rwl, pthread_rwlock_t *rDestroy ) { int r = 0; *rDestroy = NULL; if (_spin_lite_trylock(&rwl_global)) return EBUSY; if (!rwl || !*rwl) r = EINVAL; else { rwlock_t *r_ = (rwlock_t *)*rwl; if (STATIC_RWL_INITIALIZER(*rwl)) *rwl = NULL; else if (r_->valid != LIFE_RWLOCK) r = EINVAL; else if (r_->busy) r = EBUSY; else { *rDestroy = *rwl; *rwl = NULL; } } _spin_lite_unlock(&rwl_global); return r; }