Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Nov 2010 13:52:09 +0000 (UTC)
From:      David Xu <davidxu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r215424 - user/davidxu/libthr/lib/libthr/thread
Message-ID:  <201011171352.oAHDq9OY092461@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davidxu
Date: Wed Nov 17 13:52:09 2010
New Revision: 215424
URL: http://svn.freebsd.org/changeset/base/215424

Log:
  In mutex_try_lock, use _mutex_owned() to simply code, this also
  fixed some bugs which ignored recursive mutex.
  In mutex_unlock_common, check recursive mutex correctly.
  If kernel returned EOWNERDEAD, clear mutex's left-over recursive
  count, so we can correctly unlock it later.

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

Modified: user/davidxu/libthr/lib/libthr/thread/thr_mutex.c
==============================================================================
--- user/davidxu/libthr/lib/libthr/thread/thr_mutex.c	Wed Nov 17 10:43:20 2010	(r215423)
+++ user/davidxu/libthr/lib/libthr/thread/thr_mutex.c	Wed Nov 17 13:52:09 2010	(r215424)
@@ -152,7 +152,7 @@ mutex_init(struct pthread_mutex *mp,
 	}
 	if (attr->m_pshared != 0)
 		mp->__lockflags |= USYNC_PROCESS_SHARED;
-	if (attr->m_robust != PTHREAD_MUTEX_STALLED)
+	if (attr->m_robust == PTHREAD_MUTEX_ROBUST)
 		mp->__lockflags |= UMUTEX_ROBUST;
 	if (PMUTEX_TYPE(mp->__flags) == PTHREAD_MUTEX_ADAPTIVE_NP) {
 		mp->__spinloops =
@@ -213,18 +213,22 @@ mutex_trylock_common(struct pthread_mute
 				return (0);
 			}
 		}
+		if (_mutex_owned(curthread, mp) == 0)
+			return mutex_self_trylock(mp);
+		return (EBUSY);
 	} else if (mp->__lockflags & (UMUTEX_ROBUST | UMUTEX_PRIO_PROTECT2)) {
-		if (mp->__lockflags & UMUTEX_SIMPLE) {
-			if (mp->__ownerdata.__ownertd == curthread)
-				return mutex_self_trylock(mp);
-		} else {
-			if ((mp->__lockword & UMUTEX_OWNER_MASK) ==
-			      TID(curthread))
-				return mutex_self_trylock(mp);
-		}
+		if (_mutex_owned(curthread, mp) == 0)
+			return mutex_self_trylock(mp);
 		error = __thr_umutex_trylock((struct umutex *)&mp->__lockword);
-		if (error == 0 || error == EOWNERDEAD)
+		if (error == 0)
+			enqueue_mutex(curthread, mp);
+		else if (error == EOWNERDEAD) {
+			/*
+			 * Fix inconsistent recursive count for robust mutex.
+			 */
+			mp->__recurse = 0;
 			enqueue_mutex(curthread, mp);
+		}
 		return (error);
 	} else if (mp->__lockflags & UMUTEX_PRIO_INHERIT) {
 		id = TID(curthread);
@@ -232,7 +236,7 @@ mutex_trylock_common(struct pthread_mute
 			enqueue_mutex(curthread, mp);
 			return (0);
 		}
-		if ((mp->__lockflags & UMUTEX_OWNER_MASK) == id)
+		if (_mutex_owned(curthread, mp) == 0)
 			return mutex_self_trylock(mp);
 		return (EBUSY);
 	}
@@ -303,8 +307,15 @@ sleep_in_kernel:
 		error = __thr_umutex_timedlock((struct umutex *)&mp->__lockword, id, abstime);
 	}
 done:
-	if (error == 0 || error == EOWNERDEAD)
+	if (error == 0)
 		enqueue_mutex(curthread, mp);
+	else if (error == EOWNERDEAD) {
+		/*
+		 * Fix inconsistent recursive count for robust mutex.
+		 */
+		mp->__recurse = 0;
+		enqueue_mutex(curthread, mp);
+	}
 
 	return (error);
 }
@@ -344,18 +355,13 @@ _mutex_lock_common(struct pthread_mutex 
 		}
 	}
 
+	if (_mutex_owned(curthread, mp) == 0)
+		return mutex_self_lock(mp, abstime);
+
 	if (abstime != NULL && (abstime->tv_sec < 0 || abstime->tv_nsec < 0 ||
 	    abstime->tv_nsec >= 1000000000))
 		return (EINVAL);
 
-	if (mp->__lockflags & UMUTEX_SIMPLE) {
-		if (mp->__ownerdata.__ownertd == curthread)
-			return mutex_self_lock(mp, abstime);
-	} else {
-		if ((mp->__lockword & UMUTEX_OWNER_MASK) == TID(curthread))
-			return mutex_self_lock(mp, abstime);
-	}
-
 	return mutex_lock_sleep(mp, abstime);
 }
 
@@ -520,7 +526,7 @@ _mutex_unlock_common(struct pthread_mute
 	uint32_t id;
 
 	if (__predict_false(
-		PMUTEX_TYPE(mp->__lockflags) == PTHREAD_MUTEX_RECURSIVE &&
+		PMUTEX_TYPE(mp->__flags) == PTHREAD_MUTEX_RECURSIVE &&
 		mp->__recurse > 0)) {
 		mp->__recurse--;
 		if (mp->__flags & PMUTEX_FLAG_PRIVATE)
@@ -573,7 +579,7 @@ _mutex_cv_lock(pthread_mutex_t *mp, int 
 	int	error;
 
 	error = mutex_lock_common(mp, NULL, 1);
-	if (error == 0)
+	if (error == 0 || error == EOWNERDEAD)
 		mp->__recurse += count;
 	return (error);
 }
@@ -721,7 +727,6 @@ _pthread_mutex_consistent(pthread_mutex_
 	if (_mutex_owned(_get_curthread(), mp) == 0) {
 		if (mp->__lockflags & UMUTEX_ROBUST) {
 			atomic_clear_32(&mp->__lockword, UMUTEX_OWNER_DEAD);
-			mp->__recurse = 0;
 			return (0);
 		}
 	}
@@ -1000,7 +1005,7 @@ _pthread_mutex_unlock_1_0(pthread_mutex_
 			return (EINVAL);
 		return (EPERM);
 	}
-	return _pthread_mutex_unlock(mp);
+	return mutex_unlock_common(mp);
 }
 
 int



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011171352.oAHDq9OY092461>