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 --- |