thr_rtld.c (157457) | thr_rtld.c (173801) |
---|---|
1/* 2 * Copyright (c) 2006, David Xu <davidxu@freebsd.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * | 1/* 2 * Copyright (c) 2006, David Xu <davidxu@freebsd.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * |
26 * $FreeBSD: head/lib/libthr/thread/thr_rtld.c 157457 2006-04-04 02:57:49Z davidxu $ | 26 * $FreeBSD: head/lib/libthr/thread/thr_rtld.c 173801 2007-11-21 05:21:58Z davidxu $ |
27 * 28 */ 29 30 /* 31 * A lockless rwlock for rtld. 32 */ 33#include <sys/cdefs.h> 34#include <stdlib.h> --- 12 unchanged lines hidden (view full) --- 47static void _thr_rtld_rlock_acquire(void *); 48static int _thr_rtld_set_flag(int); 49static void _thr_rtld_wlock_acquire(void *); 50 51struct rtld_lock { 52 volatile int lock; 53 volatile int rd_waiters; 54 volatile int wr_waiters; | 27 * 28 */ 29 30 /* 31 * A lockless rwlock for rtld. 32 */ 33#include <sys/cdefs.h> 34#include <stdlib.h> --- 12 unchanged lines hidden (view full) --- 47static void _thr_rtld_rlock_acquire(void *); 48static int _thr_rtld_set_flag(int); 49static void _thr_rtld_wlock_acquire(void *); 50 51struct rtld_lock { 52 volatile int lock; 53 volatile int rd_waiters; 54 volatile int wr_waiters; |
55 volatile umtx_t rd_cv; 56 volatile umtx_t wr_cv; | 55 volatile long rd_cv; 56 volatile long wr_cv; |
57 void *base; 58}; 59 60static void * 61_thr_rtld_lock_create(void) 62{ 63 void *base; 64 char *p; --- 23 unchanged lines hidden (view full) --- 88 free(l->base); 89} 90 91static void 92_thr_rtld_rlock_acquire(void *lock) 93{ 94 struct pthread *curthread; 95 struct rtld_lock *l; | 57 void *base; 58}; 59 60static void * 61_thr_rtld_lock_create(void) 62{ 63 void *base; 64 char *p; --- 23 unchanged lines hidden (view full) --- 88 free(l->base); 89} 90 91static void 92_thr_rtld_rlock_acquire(void *lock) 93{ 94 struct pthread *curthread; 95 struct rtld_lock *l; |
96 umtx_t v; | 96 long v; |
97 98 curthread = _get_curthread(); 99 l = (struct rtld_lock *)lock; 100 101 THR_CRITICAL_ENTER(curthread); 102 atomic_add_acq_int(&l->lock, RC_INCR); 103 if (!(l->lock & WAFLAG)) 104 return; --- 6 unchanged lines hidden (view full) --- 111 atomic_add_int(&l->rd_waiters, -1); 112} 113 114static void 115_thr_rtld_wlock_acquire(void *lock) 116{ 117 struct pthread *curthread; 118 struct rtld_lock *l; | 97 98 curthread = _get_curthread(); 99 l = (struct rtld_lock *)lock; 100 101 THR_CRITICAL_ENTER(curthread); 102 atomic_add_acq_int(&l->lock, RC_INCR); 103 if (!(l->lock & WAFLAG)) 104 return; --- 6 unchanged lines hidden (view full) --- 111 atomic_add_int(&l->rd_waiters, -1); 112} 113 114static void 115_thr_rtld_wlock_acquire(void *lock) 116{ 117 struct pthread *curthread; 118 struct rtld_lock *l; |
119 umtx_t v; | 119 long v; |
120 121 curthread = _get_curthread(); 122 l = (struct rtld_lock *)lock; 123 124 _thr_signal_block(curthread); 125 for (;;) { 126 if (atomic_cmpset_acq_int(&l->lock, 0, WAFLAG)) 127 return; --- 52 unchanged lines hidden (view full) --- 180 return (0); 181} 182 183void 184_thr_rtld_init(void) 185{ 186 struct RtldLockInfo li; 187 struct pthread *curthread; | 120 121 curthread = _get_curthread(); 122 l = (struct rtld_lock *)lock; 123 124 _thr_signal_block(curthread); 125 for (;;) { 126 if (atomic_cmpset_acq_int(&l->lock, 0, WAFLAG)) 127 return; --- 52 unchanged lines hidden (view full) --- 180 return (0); 181} 182 183void 184_thr_rtld_init(void) 185{ 186 struct RtldLockInfo li; 187 struct pthread *curthread; |
188 umtx_t dummy; | 188 long dummy; |
189 190 curthread = _get_curthread(); 191 192 /* force to resolve _umtx_op PLT */ 193 _umtx_op((struct umtx *)&dummy, UMTX_OP_WAKE, 1, 0, 0); 194 195 li.lock_create = _thr_rtld_lock_create; 196 li.lock_destroy = _thr_rtld_lock_destroy; --- 23 unchanged lines hidden --- | 189 190 curthread = _get_curthread(); 191 192 /* force to resolve _umtx_op PLT */ 193 _umtx_op((struct umtx *)&dummy, UMTX_OP_WAKE, 1, 0, 0); 194 195 li.lock_create = _thr_rtld_lock_create; 196 li.lock_destroy = _thr_rtld_lock_destroy; --- 23 unchanged lines hidden --- |