Deleted Added
full compact
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;
227 int ret;
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);
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);
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);
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;
428
429 if (m->m_private)
430 THR_CRITICAL_ENTER(curthread);
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);
436 }
425
426 return (mutex_lock_sleep(curthread, m, abstime));
437 if (ret && m->m_private)
438 THR_CRITICAL_LEAVE(curthread);
439 return (ret);
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);
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);
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 ---