Пример #1
0
/* 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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}