diff options
| author | Mike Makonnen <mtm@FreeBSD.org> | 2004-02-18 15:22:52 +0000 | 
|---|---|---|
| committer | Mike Makonnen <mtm@FreeBSD.org> | 2004-02-18 15:22:52 +0000 | 
| commit | b325a9208792ca3a5054aa634f4389dc4acbfb89 (patch) | |
| tree | 7e0a46cf96907f599b56e5296486ae17afaa92be /lib/libthr/thread | |
| parent | a561651c343248c31c01826c080437c5f9ccc1a0 (diff) | |
Notes
Diffstat (limited to 'lib/libthr/thread')
| -rw-r--r-- | lib/libthr/thread/thr_mutex_prioceiling.c | 58 | ||||
| -rw-r--r-- | lib/libthr/thread/thr_mutex_protocol.c | 29 | 
2 files changed, 39 insertions, 48 deletions
| diff --git a/lib/libthr/thread/thr_mutex_prioceiling.c b/lib/libthr/thread/thr_mutex_prioceiling.c index 77013788bb56..c7396a4d2d77 100644 --- a/lib/libthr/thread/thr_mutex_prioceiling.c +++ b/lib/libthr/thread/thr_mutex_prioceiling.c @@ -47,9 +47,7 @@ _pthread_mutexattr_getprioceiling(pthread_mutexattr_t *mattr, int *prioceiling)  {  	int ret = 0; -	if ((mattr == NULL) || (*mattr == NULL)) -		ret = EINVAL; -	else if ((*mattr)->m_protocol != PTHREAD_PRIO_PROTECT) +	if (*mattr == NULL)  		ret = EINVAL;  	else  		*prioceiling = (*mattr)->m_ceiling; @@ -62,12 +60,13 @@ _pthread_mutexattr_setprioceiling(pthread_mutexattr_t *mattr, int prioceiling)  {  	int ret = 0; -	if ((mattr == NULL) || (*mattr == NULL)) -		ret = EINVAL; -	else if ((*mattr)->m_protocol != PTHREAD_PRIO_PROTECT) +	if (*mattr == NULL)  		ret = EINVAL; -	else +	else if (prioceiling <= PTHREAD_MAX_PRIORITY && +	    prioceiling >= PTHREAD_MIN_PRIORITY)  		(*mattr)->m_ceiling = prioceiling; +	else +		ret = EINVAL;  	return (ret);  } @@ -76,16 +75,11 @@ int  _pthread_mutex_getprioceiling(pthread_mutex_t *mutex,  			      int *prioceiling)  { -	int ret; - -	if ((mutex == NULL) || (*mutex == NULL)) -		ret = EINVAL; -	else if ((*mutex)->m_protocol != PTHREAD_PRIO_PROTECT) -		ret = EINVAL; +	if (*mutex == NULL) +		return (EINVAL);  	else -		ret = (*mutex)->m_prio; - -	return (ret); +		*prioceiling = (*mutex)->m_prio; +	return (0);  }  int @@ -94,20 +88,26 @@ _pthread_mutex_setprioceiling(pthread_mutex_t *mutex,  {  	int ret = 0; -	if ((mutex == NULL) || (*mutex == NULL)) -		ret = EINVAL; -	else if ((*mutex)->m_protocol != PTHREAD_PRIO_PROTECT) -		ret = EINVAL; -	else { -		/* Lock the mutex: */ -		if ((ret = pthread_mutex_lock(mutex)) == 0) { -			/* Return the old ceiling and set the new ceiling: */ -			*old_ceiling = (*mutex)->m_prio; -			(*mutex)->m_prio = prioceiling; +	if (*mutex == NULL) +		return (EINVAL); +	else if (prioceiling > PTHREAD_MAX_PRIORITY || +	    prioceiling < PTHREAD_MIN_PRIORITY) +		return (EINVAL); + +	/* +	 * Because of the use of pthread_mutex_unlock(), the +	 * priority ceiling of a mutex cannot be changed +	 * while the mutex is held by another thread. It also, +	 * means that the the thread trying to change the +	 * priority ceiling must adhere to prio protection rules. +	 */ +	if ((ret = pthread_mutex_lock(mutex)) == 0) { +		/* Return the old ceiling and set the new ceiling: */ +		*old_ceiling = (*mutex)->m_prio; +		(*mutex)->m_prio = prioceiling; -			/* Unlock the mutex: */ -			ret = pthread_mutex_unlock(mutex); -		} +		/* Unlock the mutex: */ +		ret = pthread_mutex_unlock(mutex);  	}  	return(ret);  } diff --git a/lib/libthr/thread/thr_mutex_protocol.c b/lib/libthr/thread/thr_mutex_protocol.c index f7be5a60605f..56c8622555a3 100644 --- a/lib/libthr/thread/thr_mutex_protocol.c +++ b/lib/libthr/thread/thr_mutex_protocol.c @@ -43,28 +43,19 @@ __weak_reference(_pthread_mutexattr_setprotocol, pthread_mutexattr_setprotocol);  int  _pthread_mutexattr_getprotocol(pthread_mutexattr_t *mattr, int *protocol)  { -	int ret = 0; - -	if ((mattr == NULL) || (*mattr == NULL)) -		ret = EINVAL; -	else -		*protocol = (*mattr)->m_protocol; - -	return(ret); +	if (*mattr == NULL) +		return (EINVAL); +	*protocol = (*mattr)->m_protocol; +	return(0);  }  int  _pthread_mutexattr_setprotocol(pthread_mutexattr_t *mattr, int protocol)  { -	int ret = 0; - -	if ((mattr == NULL) || (*mattr == NULL) || -	    (protocol < PTHREAD_PRIO_NONE) || (protocol > PTHREAD_PRIO_PROTECT)) -		ret = EINVAL; -	else { -		(*mattr)->m_protocol = protocol; -		(*mattr)->m_ceiling = PTHREAD_MAX_PRIORITY; -	} -	return(ret); +	if (*mattr == NULL || protocol < PTHREAD_PRIO_NONE || +	    protocol > PTHREAD_PRIO_PROTECT) +		return (EINVAL); +	(*mattr)->m_protocol = protocol; +	(*mattr)->m_ceiling = PTHREAD_MAX_PRIORITY; +	return(0);  } - | 
