svn commit: r214916 - user/davidxu/libthr/lib/libthr/thread

David Xu davidxu at FreeBSD.org
Sun Nov 7 13:50:43 UTC 2010


Author: davidxu
Date: Sun Nov  7 13:50:42 2010
New Revision: 214916
URL: http://svn.freebsd.org/changeset/base/214916

Log:
  Style fix, variable 'ret' should be named as  'error', also
  return error code in cond_wait for ROBUST and PP mutex,
  robust mutex uses kernel based cv.

Modified:
  user/davidxu/libthr/lib/libthr/thread/thr_cond.c

Modified: user/davidxu/libthr/lib/libthr/thread/thr_cond.c
==============================================================================
--- user/davidxu/libthr/lib/libthr/thread/thr_cond.c	Sun Nov  7 13:49:08 2010	(r214915)
+++ user/davidxu/libthr/lib/libthr/thread/thr_cond.c	Sun Nov  7 13:50:42 2010	(r214916)
@@ -92,27 +92,27 @@ cond_init(pthread_cond_t *cond, const pt
 static int
 init_static(struct pthread *thread, pthread_cond_t *cond)
 {
-	int ret;
+	int error;
 
 	THR_LOCK_ACQUIRE(thread, &_cond_static_lock);
 
 	if (*cond == NULL)
-		ret = cond_init(cond, NULL);
+		error = cond_init(cond, NULL);
 	else
-		ret = 0;
+		error = 0;
 
 	THR_LOCK_RELEASE(thread, &_cond_static_lock);
 
-	return (ret);
+	return (error);
 }
 
 #define CHECK_AND_INIT_COND							\
 	if (__predict_false((cv = (*cond)) <= THR_COND_DESTROYED)) {		\
 		if (cv == THR_COND_INITIALIZER) {				\
-			int ret;						\
-			ret = init_static(_get_curthread(), cond);		\
-			if (ret)						\
-				return (ret);					\
+			int error;						\
+			error = init_static(_get_curthread(), cond);		\
+			if (error)						\
+				return (error);					\
 		} else if (cv == THR_COND_DESTROYED) {				\
 			return (EINVAL);					\
 		}								\
@@ -169,39 +169,43 @@ cond_wait_kernel(pthread_cond_t *cond, p
 	pthread_cond_t  cv;
 	struct pthread_mutex *m;
 	int	recurse;
-	int	ret;
+	int	error, error2 = 0;
 
 	cv = *cond;
-	ret = _mutex_cv_detach(mutex, &recurse);
-	if (__predict_false(ret != 0))
-		return (ret);
+	error = _mutex_cv_detach(mutex, &recurse);
+	if (__predict_false(error != 0))
+		return (error);
 	m = *mutex;
 
 	if (cancel) {
 		_thr_cancel_enter2(curthread, 0);
-		ret = _thr_ucond_wait(&cv->c_kerncv, &m->m_lock, abstime,
+		error = _thr_ucond_wait(&cv->c_kerncv, &m->m_lock, abstime,
 			CVWAIT_ABSTIME|CVWAIT_CLOCKID);
 		_thr_cancel_leave(curthread, 0);
 	} else {
-		ret = _thr_ucond_wait(&cv->c_kerncv, &m->m_lock, abstime,
+		error = _thr_ucond_wait(&cv->c_kerncv, &m->m_lock, abstime,
 			CVWAIT_ABSTIME|CVWAIT_CLOCKID);
 	}
 
-	if (ret == 0) {
-		_mutex_cv_lock(mutex, recurse);
-	} else if (ret == EINTR || ret == ETIMEDOUT) {
-		_mutex_cv_lock(mutex, recurse);
-		if (cancel)
+	/*
+	 * Note that PP mutex and ROBUST mutex may return
+	 * interesting error codes.
+	 */
+	if (error == 0) {
+		error2 = _mutex_cv_lock(mutex, recurse);
+	} else if (error == EINTR || error == ETIMEDOUT) {
+		error2 = _mutex_cv_lock(mutex, recurse);
+		if (error2 == 0 && cancel)
 			_thr_testcancel(curthread);
-		if (ret == EINTR)
-			ret = 0;
+		if (error2 == EINTR)
+			error = 0;
 	} else {
 		/* We know that it didn't unlock the mutex. */
-		_mutex_cv_attach(mutex, recurse);
-		if (cancel)
+		error2 = _mutex_cv_attach(mutex, recurse);
+		if (error2 == 0 && cancel)
 			_thr_testcancel(curthread);
 	}
-	return (ret);
+	return (error2 != 0 ? error2 : error);
 }
 
 static int
@@ -212,17 +216,17 @@ cond_wait_user(pthread_cond_t *cond, pth
 	struct timespec ts, ts2, *tsp;
 	int		recurse;
 	pthread_cond_t  cv;
-	int		ret;
+	int		error;
 	uint64_t	seq, bseq;
 
 	cv = *cond;
 	_thr_umtx_lock_spin(&cv->c_lock);
 	cv->c_waiters++;
-	ret = _mutex_cv_unlock(mutex, &recurse);
-	if (__predict_false(ret != 0)) {
+	error = _mutex_cv_unlock(mutex, &recurse);
+	if (__predict_false(error != 0)) {
 		cv->c_waiters--;
 		_thr_umtx_unlock(&cv->c_lock);
-		return (ret);
+		return (error);
 	}
 
 	bseq = cv->c_broadcast_seq;
@@ -239,24 +243,24 @@ cond_wait_user(pthread_cond_t *cond, pth
 
 		if (cancel) {
 			_thr_cancel_enter2(curthread, 0);
-			ret = _thr_umtx_wait_uint((u_int *)&cv->c_seq,
+			error = _thr_umtx_wait_uint((u_int *)&cv->c_seq,
 				(u_int)seq, tsp, CV_PSHARED(cv));
 			_thr_cancel_leave(curthread, 0);
 		} else {
-			ret = _thr_umtx_wait_uint((u_int *)&cv->c_seq,
+			error = _thr_umtx_wait_uint((u_int *)&cv->c_seq,
 				(u_int)seq, tsp, CV_PSHARED(cv));
 		}
 
 		_thr_umtx_lock_spin(&cv->c_lock);
 		if (cv->c_broadcast_seq != bseq) {
-			ret = 0;
+			error = 0;
 			break;
 		}
 		if (cv->c_signaled > 0) {
 			cv->c_signaled--;
-			ret = 0;
+			error = 0;
 			break;
-		} else if (ret == ETIMEDOUT) {
+		} else if (error == ETIMEDOUT) {
 			cv->c_waiters--;
 			break;
 		} else if (cancel && SHOULD_CANCEL(curthread) &&
@@ -269,7 +273,7 @@ cond_wait_user(pthread_cond_t *cond, pth
 	}
 	_thr_umtx_unlock(&cv->c_lock);
 	_mutex_cv_lock(mutex, recurse);
-	return (ret);
+	return (error);
 }
 
 
@@ -306,7 +310,8 @@ cond_wait_common(pthread_cond_t *cond, p
 	 */
 	if (curthread->attr.sched_policy != SCHED_OTHER ||
 	    curthread->priority_mutex_count != 0  ||
-	    (m->m_lock.m_flags & (UMUTEX_PRIO_PROTECT|UMUTEX_PRIO_INHERIT)) != 0)
+	    (m->m_lock.m_flags & (UMUTEX_PRIO_PROTECT|UMUTEX_PRIO_INHERIT|
+		UMUTEX_ROBUST)) != 0)
 		return cond_wait_kernel(cond, mutex, abstime, cancel);
 	else
 		return cond_wait_user(cond, mutex, abstime, cancel);


More information about the svn-src-user mailing list