Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Nov 2010 02:47:29 +0000 (UTC)
From:      David Xu <davidxu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r214970 - user/davidxu/libthr/lib/libthr/thread
Message-ID:  <201011080247.oA82lTlv004301@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davidxu
Date: Mon Nov  8 02:47:29 2010
New Revision: 214970
URL: http://svn.freebsd.org/changeset/base/214970

Log:
  Make the size of mutex smaller. Merge m_private and m_type into single
  field m_mtxflags. Change type of m_spinloop and m_yield to short integer,
  it is enough for practical use.

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

Modified: user/davidxu/libthr/lib/libthr/thread/thr_mutex.c
==============================================================================
--- user/davidxu/libthr/lib/libthr/thread/thr_mutex.c	Mon Nov  8 02:19:53 2010	(r214969)
+++ user/davidxu/libthr/lib/libthr/thread/thr_mutex.c	Mon Nov  8 02:47:29 2010	(r214970)
@@ -140,7 +140,7 @@ mutex_init(pthread_mutex_t *mutex,
 		calloc_cb(1, sizeof(struct pthread_mutex))) == NULL)
 		return (ENOMEM);
 
-	pmutex->m_type = attr->m_type;
+	pmutex->m_mtxflags = attr->m_type;
 	pmutex->m_ownertd = NULL;
 	pmutex->m_recurse = 0;
 	pmutex->m_spinloops = 0;
@@ -167,7 +167,7 @@ mutex_init(pthread_mutex_t *mutex,
 		pmutex->m_lock.m_flags |= USYNC_PROCESS_SHARED;
 	if (attr->m_robust != 0)
 		pmutex->m_lock.m_flags |= UMUTEX_ROBUST;
-	if (pmutex->m_type == PTHREAD_MUTEX_ADAPTIVE_NP) {
+	if (PMUTEX_TYPE(pmutex->m_mtxflags) == PTHREAD_MUTEX_ADAPTIVE_NP) {
 		pmutex->m_spinloops =
 		    _thr_spinloops ? _thr_spinloops: MUTEX_ADAPTIVE_SPINS;
 		pmutex->m_yieldloops = _thr_yieldloops;
@@ -217,7 +217,7 @@ _pthread_mutex_init_calloc_cb(pthread_mu
 
 	ret = mutex_init(mutex, &attr, calloc_cb);
 	if (ret == 0)
-		(*mutex)->m_private = 1;
+		(*mutex)->m_mtxflags |= PMUTEX_FLAG_PRIVATE;
 	return (ret);
 }
 
@@ -322,7 +322,7 @@ __pthread_mutex_trylock(pthread_mutex_t 
 
 	CHECK_AND_INIT_MUTEX
 
-	if (!m->m_private)
+	if (!(m->m_mtxflags & PMUTEX_FLAG_PRIVATE))
 		return mutex_trylock_common(m);
 	THR_CRITICAL_ENTER(curthread);
 	error = mutex_trylock_common(m);
@@ -461,9 +461,9 @@ mutex_lock_common(struct pthread_mutex *
 	struct pthread *curthread = _get_curthread();
 	int error;
 
-	if (cvattach || m->m_private == 0)
+	if (cvattach || (m->m_mtxflags & PMUTEX_FLAG_PRIVATE) == 0)
 		return _mutex_lock_common(m, abstime);
-	if (m->m_private)
+	if (m->m_mtxflags & PMUTEX_FLAG_PRIVATE)
 		THR_CRITICAL_ENTER(curthread);
 	error = _mutex_lock_common(m, abstime);
 	if (error && error != EOWNERDEAD)
@@ -506,7 +506,7 @@ mutex_self_trylock(struct pthread_mutex 
 {
 	int	ret;
 
-	switch (m->m_type) {
+	switch (PMUTEX_TYPE(m->m_mtxflags)) {
 	case PTHREAD_MUTEX_ERRORCHECK:
 	case PTHREAD_MUTEX_NORMAL:
 		ret = EBUSY; 
@@ -535,7 +535,7 @@ mutex_self_lock(struct pthread_mutex *m,
 	struct timespec	ts1, ts2;
 	int	ret;
 
-	switch (m->m_type) {
+	switch (PMUTEX_TYPE(m->m_mtxflags)) {
 	case PTHREAD_MUTEX_ERRORCHECK:
 	case PTHREAD_MUTEX_ADAPTIVE_NP:
 		if (abstime) {
@@ -633,10 +633,10 @@ _mutex_unlock_common(pthread_mutex_t *mu
 	m = *mutex;
 
 	if (__predict_false(
-		m->m_type == PTHREAD_MUTEX_RECURSIVE &&
+		PMUTEX_TYPE(m->m_mtxflags) == PTHREAD_MUTEX_RECURSIVE &&
 		m->m_recurse > 0)) {
 		m->m_recurse--;
-		if (m->m_private)
+		if (m->m_mtxflags & PMUTEX_FLAG_PRIVATE)
 			THR_CRITICAL_LEAVE(curthread);
 		return (0);
 	}
@@ -664,7 +664,7 @@ _mutex_unlock_common(pthread_mutex_t *mu
 	}
 	__thr_umutex_unlock(&m->m_lock, id);
 out:
-	if (m->m_private)
+	if (m->m_mtxflags & PMUTEX_FLAG_PRIVATE)
 		THR_CRITICAL_LEAVE(curthread);
 	return (0);
 }

Modified: user/davidxu/libthr/lib/libthr/thread/thr_private.h
==============================================================================
--- user/davidxu/libthr/lib/libthr/thread/thr_private.h	Mon Nov  8 02:19:53 2010	(r214969)
+++ user/davidxu/libthr/lib/libthr/thread/thr_private.h	Mon Nov  8 02:47:29 2010	(r214970)
@@ -140,14 +140,17 @@ TAILQ_HEAD(mutex_link_list, mutex_link);
 #define	THR_RWLOCK_INITIALIZER		((struct pthread_rwlock *)NULL)
 #define	THR_RWLOCK_DESTROYED		((struct pthread_rwlock *)1)
 
+#define PMUTEX_FLAG_TYPE_MASK	0x0ff
+#define PMUTEX_FLAG_PRIVATE	0x100
+#define PMUTEX_TYPE(mtxflags)	((mtxflags) & PMUTEX_FLAG_TYPE_MASK)
+
 struct pthread_mutex {
 	struct umutex		m_lock;
-	enum pthread_mutextype	m_type;
 	struct pthread		*m_ownertd;
 	int			m_recurse;
-	int			m_spinloops;
-	int			m_yieldloops;
-	int			m_private;
+	int			m_mtxflags;
+	uint16_t		m_spinloops;
+	uint16_t		m_yieldloops;
 };
 
 struct pthread_mutex_attr {



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