svn commit: r214970 - user/davidxu/libthr/lib/libthr/thread
David Xu
davidxu at FreeBSD.org
Mon Nov 8 02:47:29 UTC 2010
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 {
More information about the svn-src-user
mailing list