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>