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 * notice unmodified, this list of conditions, and the following 10 * disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 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: src/lib/libpthread/thread/thr_rtld.c,v 1.5 2003/11/05 18:19:24 deischen Exp $ 27 */ 28 29 #include "namespace.h" 30 #include <machine/tls.h> 31 #include <stdlib.h> 32 #include <pthread.h> 33 34 #include "un-namespace.h" 35 #include "rtld_lock.h" 36 #include "thr_private.h" 37 38 static int _thr_rtld_clr_flag(int); 39 static void *_thr_rtld_lock_create(void); 40 static void _thr_rtld_lock_destroy(void *); 41 static void _thr_rtld_lock_release(void *); 42 static void _thr_rtld_rlock_acquire(void *); 43 static int _thr_rtld_set_flag(int); 44 static void _thr_rtld_wlock_acquire(void *); 45 46 static void * 47 _thr_rtld_lock_create(void) 48 { 49 pthread_rwlock_t prwlock; 50 if (_pthread_rwlock_init(&prwlock, NULL)) 51 return (NULL); 52 return (prwlock); 53 } 54 55 static void 56 _thr_rtld_lock_destroy(void *lock) 57 { 58 pthread_rwlock_t prwlock; 59 60 prwlock = (pthread_rwlock_t)lock; 61 if (prwlock != NULL) 62 _pthread_rwlock_destroy(&prwlock); 63 } 64 65 static void 66 _thr_rtld_rlock_acquire(void *lock) 67 { 68 pthread_rwlock_t prwlock; 69 70 prwlock = (pthread_rwlock_t)lock; 71 _pthread_rwlock_rdlock(&prwlock); 72 } 73 74 static void 75 _thr_rtld_wlock_acquire(void *lock) 76 { 77 pthread_rwlock_t prwlock; 78 79 prwlock = (pthread_rwlock_t)lock; 80 _pthread_rwlock_wrlock(&prwlock); 81 } 82 83 static void 84 _thr_rtld_lock_release(void *lock) 85 { 86 pthread_rwlock_t prwlock; 87 88 prwlock = (pthread_rwlock_t)lock; 89 _pthread_rwlock_unlock(&prwlock); 90 } 91 92 93 static int 94 _thr_rtld_set_flag(int mask) 95 { 96 struct pthread *curthread; 97 int bits; 98 99 curthread = tls_get_curthread(); 100 if (curthread != NULL) { 101 bits = curthread->rtld_bits; 102 curthread->rtld_bits |= mask; 103 } else { 104 bits = 0; 105 PANIC("No current thread in rtld call"); 106 } 107 108 return (bits); 109 } 110 111 static int 112 _thr_rtld_clr_flag(int mask) 113 { 114 struct pthread *curthread; 115 int bits; 116 117 curthread = tls_get_curthread(); 118 if (curthread != NULL) { 119 bits = curthread->rtld_bits; 120 curthread->rtld_bits &= ~mask; 121 } else { 122 bits = 0; 123 PANIC("No current thread in rtld call"); 124 } 125 return (bits); 126 } 127 128 void 129 _thr_rtld_init(void) 130 { 131 struct RtldLockInfo li; 132 133 li.lock_create = _thr_rtld_lock_create; 134 li.lock_destroy = _thr_rtld_lock_destroy; 135 li.rlock_acquire = _thr_rtld_rlock_acquire; 136 li.wlock_acquire = _thr_rtld_wlock_acquire; 137 li.lock_release = _thr_rtld_lock_release; 138 li.thread_set_flag = _thr_rtld_set_flag; 139 li.thread_clr_flag = _thr_rtld_clr_flag; 140 li.at_fork = NULL; 141 _rtld_thread_init(&li); 142 } 143 144 void 145 _thr_rtld_fini(void) 146 { 147 _rtld_thread_init(NULL); 148 } 149