Deleted Added
full compact
thr_mutex.c (179970) thr_mutex.c (212077)
1/*
2 * Copyright (c) 1995 John Birrell <jb@cimlogic.com.au>.
3 * Copyright (c) 2006 David Xu <davidxu@freebsd.org>.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 16 unchanged lines hidden (view full) ---

25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
1/*
2 * Copyright (c) 1995 John Birrell <jb@cimlogic.com.au>.
3 * Copyright (c) 2006 David Xu <davidxu@freebsd.org>.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 16 unchanged lines hidden (view full) ---

25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * $FreeBSD: head/lib/libthr/thread/thr_mutex.c 179970 2008-06-24 07:32:12Z davidxu $
33 * $FreeBSD: head/lib/libthr/thread/thr_mutex.c 212077 2010-09-01 03:11:21Z davidxu $
34 */
35
36#include "namespace.h"
37#include <stdlib.h>
38#include <errno.h>
39#include <string.h>
40#include <sys/param.h>
41#include <sys/queue.h>

--- 177 unchanged lines hidden (view full) ---

219 void *(calloc_cb)(size_t, size_t))
220{
221 static const struct pthread_mutex_attr attr = {
222 .m_type = PTHREAD_MUTEX_NORMAL,
223 .m_protocol = PTHREAD_PRIO_NONE,
224 .m_ceiling = 0
225 };
226 static const struct pthread_mutex_attr *pattr = &attr;
34 */
35
36#include "namespace.h"
37#include <stdlib.h>
38#include <errno.h>
39#include <string.h>
40#include <sys/param.h>
41#include <sys/queue.h>

--- 177 unchanged lines hidden (view full) ---

219 void *(calloc_cb)(size_t, size_t))
220{
221 static const struct pthread_mutex_attr attr = {
222 .m_type = PTHREAD_MUTEX_NORMAL,
223 .m_protocol = PTHREAD_PRIO_NONE,
224 .m_ceiling = 0
225 };
226 static const struct pthread_mutex_attr *pattr = &attr;
227 int ret;
227
228
228 return mutex_init(mutex, (pthread_mutexattr_t *)&pattr, calloc_cb);
229 ret = mutex_init(mutex, (pthread_mutexattr_t *)&pattr, calloc_cb);
230 if (ret == 0)
231 (*mutex)->m_private = 1;
232 return (ret);
229}
230
231void
232_mutex_fork(struct pthread *curthread)
233{
234 struct pthread_mutex *m;
235
236 /*

--- 77 unchanged lines hidden (view full) ---

314mutex_trylock_common(struct pthread *curthread, pthread_mutex_t *mutex)
315{
316 struct pthread_mutex *m;
317 uint32_t id;
318 int ret;
319
320 id = TID(curthread);
321 m = *mutex;
233}
234
235void
236_mutex_fork(struct pthread *curthread)
237{
238 struct pthread_mutex *m;
239
240 /*

--- 77 unchanged lines hidden (view full) ---

318mutex_trylock_common(struct pthread *curthread, pthread_mutex_t *mutex)
319{
320 struct pthread_mutex *m;
321 uint32_t id;
322 int ret;
323
324 id = TID(curthread);
325 m = *mutex;
326 if (m->m_private)
327 THR_CRITICAL_ENTER(curthread);
322 ret = _thr_umutex_trylock(&m->m_lock, id);
323 if (ret == 0) {
324 ENQUEUE_MUTEX(curthread, m);
325 } else if (m->m_owner == curthread) {
326 ret = mutex_self_trylock(m);
327 } /* else {} */
328 ret = _thr_umutex_trylock(&m->m_lock, id);
329 if (ret == 0) {
330 ENQUEUE_MUTEX(curthread, m);
331 } else if (m->m_owner == curthread) {
332 ret = mutex_self_trylock(m);
333 } /* else {} */
328
334 if (ret && m->m_private)
335 THR_CRITICAL_LEAVE(curthread);
329 return (ret);
330}
331
332int
333__pthread_mutex_trylock(pthread_mutex_t *mutex)
334{
335 struct pthread *curthread = _get_curthread();
336 int ret;

--- 75 unchanged lines hidden (view full) ---

412
413 return (ret);
414}
415
416static inline int
417mutex_lock_common(struct pthread *curthread, struct pthread_mutex *m,
418 const struct timespec *abstime)
419{
336 return (ret);
337}
338
339int
340__pthread_mutex_trylock(pthread_mutex_t *mutex)
341{
342 struct pthread *curthread = _get_curthread();
343 int ret;

--- 75 unchanged lines hidden (view full) ---

419
420 return (ret);
421}
422
423static inline int
424mutex_lock_common(struct pthread *curthread, struct pthread_mutex *m,
425 const struct timespec *abstime)
426{
427 int ret;
420
428
429 if (m->m_private)
430 THR_CRITICAL_ENTER(curthread);
421 if (_thr_umutex_trylock2(&m->m_lock, TID(curthread)) == 0) {
422 ENQUEUE_MUTEX(curthread, m);
431 if (_thr_umutex_trylock2(&m->m_lock, TID(curthread)) == 0) {
432 ENQUEUE_MUTEX(curthread, m);
423 return (0);
433 ret = 0;
434 } else {
435 ret = mutex_lock_sleep(curthread, m, abstime);
424 }
436 }
425
426 return (mutex_lock_sleep(curthread, m, abstime));
437 if (ret && m->m_private)
438 THR_CRITICAL_LEAVE(curthread);
439 return (ret);
427}
428
429int
430__pthread_mutex_lock(pthread_mutex_t *mutex)
431{
432 struct pthread *curthread;
433 struct pthread_mutex *m;
434 int ret;

--- 185 unchanged lines hidden (view full) ---

620 TAILQ_REMOVE(&curthread->mutexq, m, m_qe);
621 else {
622 TAILQ_REMOVE(&curthread->pp_mutexq, m, m_qe);
623 set_inherited_priority(curthread, m);
624 }
625 MUTEX_INIT_LINK(m);
626 _thr_umutex_unlock(&m->m_lock, id);
627 }
440}
441
442int
443__pthread_mutex_lock(pthread_mutex_t *mutex)
444{
445 struct pthread *curthread;
446 struct pthread_mutex *m;
447 int ret;

--- 185 unchanged lines hidden (view full) ---

633 TAILQ_REMOVE(&curthread->mutexq, m, m_qe);
634 else {
635 TAILQ_REMOVE(&curthread->pp_mutexq, m, m_qe);
636 set_inherited_priority(curthread, m);
637 }
638 MUTEX_INIT_LINK(m);
639 _thr_umutex_unlock(&m->m_lock, id);
640 }
641 if (m->m_private)
642 THR_CRITICAL_LEAVE(curthread);
628 return (0);
629}
630
631int
632_mutex_cv_unlock(pthread_mutex_t *mutex, int *count)
633{
634 struct pthread *curthread = _get_curthread();
635 struct pthread_mutex *m;

--- 19 unchanged lines hidden (view full) ---

655 if ((m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)
656 TAILQ_REMOVE(&curthread->mutexq, m, m_qe);
657 else {
658 TAILQ_REMOVE(&curthread->pp_mutexq, m, m_qe);
659 set_inherited_priority(curthread, m);
660 }
661 MUTEX_INIT_LINK(m);
662 _thr_umutex_unlock(&m->m_lock, TID(curthread));
643 return (0);
644}
645
646int
647_mutex_cv_unlock(pthread_mutex_t *mutex, int *count)
648{
649 struct pthread *curthread = _get_curthread();
650 struct pthread_mutex *m;

--- 19 unchanged lines hidden (view full) ---

670 if ((m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)
671 TAILQ_REMOVE(&curthread->mutexq, m, m_qe);
672 else {
673 TAILQ_REMOVE(&curthread->pp_mutexq, m, m_qe);
674 set_inherited_priority(curthread, m);
675 }
676 MUTEX_INIT_LINK(m);
677 _thr_umutex_unlock(&m->m_lock, TID(curthread));
678
679 if (m->m_private)
680 THR_CRITICAL_LEAVE(curthread);
663 return (0);
664}
665
666int
667_pthread_mutex_getprioceiling(pthread_mutex_t *mutex,
668 int *prioceiling)
669{
670 int ret;

--- 109 unchanged lines hidden ---
681 return (0);
682}
683
684int
685_pthread_mutex_getprioceiling(pthread_mutex_t *mutex,
686 int *prioceiling)
687{
688 int ret;

--- 109 unchanged lines hidden ---