Ejemplo n.º 1
0
int
_pthread_barrier_destroy(pthread_barrier_t *barrier)
{
	pthread_barrier_t bar;
	struct pthread *curthread;
	int pshared;

	if (barrier == NULL || *barrier == NULL)
		return (EINVAL);

	if (*barrier == THR_PSHARED_PTR) {
		bar = __thr_pshared_offpage(barrier, 0);
		if (bar == NULL) {
			*barrier = NULL;
			return (0);
		}
		pshared = 1;
	} else {
		bar = *barrier;
		pshared = 0;
	}
	curthread = _get_curthread();
	THR_UMUTEX_LOCK(curthread, &bar->b_lock);
	if (bar->b_destroying) {
		THR_UMUTEX_UNLOCK(curthread, &bar->b_lock);
		return (EBUSY);
	}
	bar->b_destroying = 1;
	do {
		if (bar->b_waiters > 0) {
			bar->b_destroying = 0;
			THR_UMUTEX_UNLOCK(curthread, &bar->b_lock);
			return (EBUSY);
		}
		if (bar->b_refcount != 0) {
			_thr_ucond_wait(&bar->b_cv, &bar->b_lock, NULL, 0);
			THR_UMUTEX_LOCK(curthread, &bar->b_lock);
		} else
			break;
	} while (1);
	bar->b_destroying = 0;
	THR_UMUTEX_UNLOCK(curthread, &bar->b_lock);

	*barrier = NULL;
	if (pshared)
		__thr_pshared_destroy(barrier);
	else
		free(bar);
	return (0);
}
Ejemplo n.º 2
0
int
_pthread_spin_destroy(pthread_spinlock_t *lock)
{
	void *l;
	int ret;

	if (lock == NULL || *lock == NULL) {
		ret = EINVAL;
	} else if (*lock == THR_PSHARED_PTR) {
		l = __thr_pshared_offpage(lock, 0);
		if (l != NULL)
			__thr_pshared_destroy(l);
		ret = 0;
	} else {
		free(*lock);
		*lock = NULL;
		ret = 0;
	}
	return (ret);
}
Ejemplo n.º 3
0
int
_pthread_rwlock_destroy (pthread_rwlock_t *rwlock)
{
	pthread_rwlock_t prwlock;
	int ret;

	prwlock = *rwlock;
	if (prwlock == THR_RWLOCK_INITIALIZER)
		ret = 0;
	else if (prwlock == THR_RWLOCK_DESTROYED)
		ret = EINVAL;
	else if (prwlock == THR_PSHARED_PTR) {
		*rwlock = THR_RWLOCK_DESTROYED;
		__thr_pshared_destroy(rwlock);
		ret = 0;
	} else {
		*rwlock = THR_RWLOCK_DESTROYED;
		free(prwlock);
		ret = 0;
	}
	return (ret);
}
Ejemplo n.º 4
0
int
_pthread_cond_destroy(pthread_cond_t *cond)
{
	struct pthread_cond *cvp;
	int error;

	error = 0;
	if (*cond == THR_PSHARED_PTR) {
		cvp = __thr_pshared_offpage(cond, 0);
		if (cvp != NULL)
			__thr_pshared_destroy(cond);
		*cond = THR_COND_DESTROYED;
	} else if ((cvp = *cond) == THR_COND_INITIALIZER) {
		/* nothing */
	} else if (cvp == THR_COND_DESTROYED) {
		error = EINVAL;
	} else {
		cvp = *cond;
		*cond = THR_COND_DESTROYED;
		free(cvp);
	}
	return (error);
}