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 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 |
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 {} */ |
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); |
433 ret = 0; 434 } else { 435 ret = mutex_lock_sleep(curthread, m, abstime); |
436 } |
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 --- |