Deleted Added
full compact
33c33
< * $FreeBSD: head/lib/libthr/thread/thr_mutex.c 212077 2010-09-01 03:11:21Z davidxu $
---
> * $FreeBSD: head/lib/libthr/thread/thr_mutex.c 213241 2010-09-28 04:57:56Z davidxu $
127c127
< const pthread_mutexattr_t *mutex_attr,
---
> const struct pthread_mutex_attr *mutex_attr,
136c136
< attr = *mutex_attr;
---
> attr = mutex_attr;
155a156,159
> case PTHREAD_PRIO_NONE:
> pmutex->m_lock.m_owner = UMUTEX_UNOWNED;
> pmutex->m_lock.m_flags = 0;
> break;
165,167d168
< case PTHREAD_PRIO_NONE:
< pmutex->m_lock.m_owner = UMUTEX_UNOWNED;
< pmutex->m_lock.m_flags = 0;
187,188c188,191
< if (*mutex == NULL)
< ret = mutex_init(mutex, NULL, calloc);
---
> if (*mutex == THR_MUTEX_INITIALIZER)
> ret = mutex_init(mutex, &_pthread_mutexattr_default, calloc);
> else if (*mutex == THR_ADAPTIVE_MUTEX_INITIALIZER)
> ret = mutex_init(mutex, &_pthread_mutexattr_adaptive_default, calloc);
191d193
<
213c215
< return mutex_init(mutex, mutex_attr, calloc);
---
> return mutex_init(mutex, mutex_attr ? *mutex_attr : NULL, calloc);
226d227
< static const struct pthread_mutex_attr *pattr = &attr;
229c230
< ret = mutex_init(mutex, (pthread_mutexattr_t *)&pattr, calloc_cb);
---
> ret = mutex_init(mutex, &attr, calloc_cb);
264c265,268
< if (__predict_false(*mutex == NULL))
---
> m = *mutex;
> if (m < THR_MUTEX_DESTROYED) {
> ret = 0;
> } else if (m == THR_MUTEX_DESTROYED) {
266c270
< else {
---
> } else {
273c277
< ret = _thr_umutex_trylock(&(*mutex)->m_lock, id);
---
> ret = _thr_umutex_trylock(&m->m_lock, id);
276d279
< m = *mutex;
288,292c291
< /*
< * Save a pointer to the mutex so it can be free'd
< * and set the caller's pointer to NULL.
< */
< *mutex = NULL;
---
> *mutex = THR_MUTEX_DESTROYED;
316a316,326
> #define CHECK_AND_INIT_MUTEX \
> if (__predict_false((m = *mutex) <= THR_MUTEX_DESTROYED)) { \
> if (m == THR_MUTEX_DESTROYED) \
> return (EINVAL); \
> int ret; \
> ret = init_static(_get_curthread(), mutex); \
> if (ret) \
> return (ret); \
> m = *mutex; \
> }
>
318c328
< mutex_trylock_common(struct pthread *curthread, pthread_mutex_t *mutex)
---
> mutex_trylock_common(pthread_mutex_t *mutex)
320c330,331
< struct pthread_mutex *m;
---
> struct pthread *curthread = _get_curthread();
> struct pthread_mutex *m = *mutex;
325d335
< m = *mutex;
329c339
< if (ret == 0) {
---
> if (__predict_true(ret == 0)) {
342,343c352
< struct pthread *curthread = _get_curthread();
< int ret;
---
> struct pthread_mutex *m;
345,354c354,356
< /*
< * If the mutex is statically initialized, perform the dynamic
< * initialization:
< */
< if (__predict_false(*mutex == NULL)) {
< ret = init_static(curthread, mutex);
< if (__predict_false(ret))
< return (ret);
< }
< return (mutex_trylock_common(curthread, mutex));
---
> CHECK_AND_INIT_MUTEX
>
> return (mutex_trylock_common(mutex));
375,376c377,380
< if (m->m_lock.m_flags & (UMUTEX_PRIO_PROTECT | UMUTEX_PRIO_INHERIT))
< goto sleep_in_kernel;
---
> if (__predict_false(
> (m->m_lock.m_flags &
> (UMUTEX_PRIO_PROTECT | UMUTEX_PRIO_INHERIT)) != 0))
> goto sleep_in_kernel;
424c428
< mutex_lock_common(struct pthread *curthread, struct pthread_mutex *m,
---
> mutex_lock_common(struct pthread_mutex *m,
426a431
> struct pthread *curthread = _get_curthread();
445,447c450
< struct pthread *curthread;
< struct pthread_mutex *m;
< int ret;
---
> struct pthread_mutex *m;
451c454
< curthread = _get_curthread();
---
> CHECK_AND_INIT_MUTEX
453,464c456
< /*
< * If the mutex is statically initialized, perform the dynamic
< * initialization:
< */
< if (__predict_false((m = *mutex) == NULL)) {
< ret = init_static(curthread, mutex);
< if (__predict_false(ret))
< return (ret);
< m = *mutex;
< }
<
< return (mutex_lock_common(curthread, m, NULL));
---
> return (mutex_lock_common(m, NULL));
470,472c462
< struct pthread *curthread;
< struct pthread_mutex *m;
< int ret;
---
> struct pthread_mutex *m;
476c466
< curthread = _get_curthread();
---
> CHECK_AND_INIT_MUTEX
478,488c468
< /*
< * If the mutex is statically initialized, perform the dynamic
< * initialization:
< */
< if (__predict_false((m = *mutex) == NULL)) {
< ret = init_static(curthread, mutex);
< if (__predict_false(ret))
< return (ret);
< m = *mutex;
< }
< return (mutex_lock_common(curthread, m, abstime));
---
> return (mutex_lock_common(m, abstime));
498c478
< _mutex_cv_lock(pthread_mutex_t *m, int count)
---
> _mutex_cv_lock(pthread_mutex_t *mutex, int count)
499a480
> struct pthread_mutex *m;
502c483,484
< ret = mutex_lock_common(_get_curthread(), *m, NULL);
---
> m = *mutex;
> ret = mutex_lock_common(m, NULL);
504,505c486,487
< (*m)->m_refcount--;
< (*m)->m_count += count;
---
> m->m_refcount--;
> m->m_count += count;
511c493
< mutex_self_trylock(pthread_mutex_t m)
---
> mutex_self_trylock(struct pthread_mutex *m)
539c521
< mutex_self_lock(pthread_mutex_t m, const struct timespec *abstime)
---
> mutex_self_lock(struct pthread_mutex *m, const struct timespec *abstime)
614,615c596,601
< if (__predict_false((m = *mutex) == NULL))
< return (EINVAL);
---
> m = *mutex;
> if (__predict_false(m <= THR_MUTEX_DESTROYED)) {
> if (m == THR_MUTEX_DESTROYED)
> return (EINVAL);
> return (EPERM);
> }
632c618
< if ((m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)
---
> if (__predict_true((m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0))
652,654c638
< if (__predict_false((m = *mutex) == NULL))
< return (EINVAL);
<
---
> m = *mutex;
670c654
< if ((m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)
---
> if (__predict_true((m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0))
687a672
> struct pthread_mutex *m;
690c675,677
< if (*mutex == NULL)
---
> m = *mutex;
> if ((m <= THR_MUTEX_DESTROYED) ||
> (m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)
692,693d678
< else if (((*mutex)->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)
< ret = EINVAL;
695c680
< *prioceiling = (*mutex)->m_lock.m_ceilings[0];
---
> *prioceiling = m->m_lock.m_ceilings[0];
699c684
< return(ret);
---
> return (ret);
711c696,697
< if (m == NULL || (m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)
---
> if ((m <= THR_MUTEX_DESTROYED) ||
> (m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)
740,742c726,730
< if (*mutex == NULL)
< return (EINVAL);
< *count = (*mutex)->m_spinloops;
---
> struct pthread_mutex *m;
>
> CHECK_AND_INIT_MUTEX
>
> *count = m->m_spinloops;
749,750c737
< struct pthread *curthread = _get_curthread();
< int ret;
---
> struct pthread_mutex *m;
752,757c739,741
< if (__predict_false(*mutex == NULL)) {
< ret = init_static(curthread, mutex);
< if (__predict_false(ret))
< return (ret);
< }
< (*mutex)->m_spinloops = count;
---
> CHECK_AND_INIT_MUTEX
>
> m->m_spinloops = count;
764,766c748,752
< if (*mutex == NULL)
< return (EINVAL);
< *count = (*mutex)->m_yieldloops;
---
> struct pthread_mutex *m;
>
> CHECK_AND_INIT_MUTEX
>
> *count = m->m_yieldloops;
773,774c759
< struct pthread *curthread = _get_curthread();
< int ret;
---
> struct pthread_mutex *m;
776,781c761,763
< if (__predict_false(*mutex == NULL)) {
< ret = init_static(curthread, mutex);
< if (__predict_false(ret))
< return (ret);
< }
< (*mutex)->m_yieldloops = count;
---
> CHECK_AND_INIT_MUTEX
>
> m->m_yieldloops = count;
788,789c770
< struct pthread *curthread = _get_curthread();
< int ret;
---
> struct pthread_mutex *m;
791,796c772,775
< if (__predict_false(*mutex == NULL)) {
< ret = init_static(curthread, mutex);
< if (__predict_false(ret))
< return (ret);
< }
< return ((*mutex)->m_owner == curthread);
---
> m = *mutex;
> if (m <= THR_MUTEX_DESTROYED)
> return (0);
> return (m->m_owner == _get_curthread());