67 #define LOCKRET(func) do {\ 69 if( (lockret_err=(func)) != 0) \ 70 log_err("%s at %d could not " #func ": %s", \ 71 __FILE__, __LINE__, strerror(lockret_err)); \ 76 #if defined(HAVE_PTHREAD) && defined(HAVE_PTHREAD_SPINLOCK_T) && defined(ENABLE_LOCK_CHECKS) 77 # define USE_THREAD_DEBUG 80 #ifdef USE_THREAD_DEBUG 86 #define lock_protect(lock, area, size) 87 #define lock_unprotect(lock, area) 88 #define lock_get_mem(lock) (0) 89 #define checklock_start() 90 #define checklock_stop() 100 #define lock_basic_init(lock) LOCKRET(pthread_mutex_init(lock, NULL)) 101 #define lock_basic_destroy(lock) LOCKRET(pthread_mutex_destroy(lock)) 102 #define lock_basic_lock(lock) LOCKRET(pthread_mutex_lock(lock)) 103 #define lock_basic_unlock(lock) LOCKRET(pthread_mutex_unlock(lock)) 105 #ifndef HAVE_PTHREAD_RWLOCK_T 108 #define lock_rw_init(lock) LOCKRET(pthread_mutex_init(lock, NULL)) 109 #define lock_rw_destroy(lock) LOCKRET(pthread_mutex_destroy(lock)) 110 #define lock_rw_rdlock(lock) LOCKRET(pthread_mutex_lock(lock)) 111 #define lock_rw_wrlock(lock) LOCKRET(pthread_mutex_lock(lock)) 112 #define lock_rw_unlock(lock) LOCKRET(pthread_mutex_unlock(lock)) 117 #define lock_rw_init(lock) LOCKRET(pthread_rwlock_init(lock, NULL)) 118 #define lock_rw_destroy(lock) LOCKRET(pthread_rwlock_destroy(lock)) 119 #define lock_rw_rdlock(lock) LOCKRET(pthread_rwlock_rdlock(lock)) 120 #define lock_rw_wrlock(lock) LOCKRET(pthread_rwlock_wrlock(lock)) 121 #define lock_rw_unlock(lock) LOCKRET(pthread_rwlock_unlock(lock)) 124 #ifndef HAVE_PTHREAD_SPINLOCK_T 128 #define lock_quick_init(lock) LOCKRET(pthread_mutex_init(lock, NULL)) 129 #define lock_quick_destroy(lock) LOCKRET(pthread_mutex_destroy(lock)) 130 #define lock_quick_lock(lock) LOCKRET(pthread_mutex_lock(lock)) 131 #define lock_quick_unlock(lock) LOCKRET(pthread_mutex_unlock(lock)) 143 #define lock_quick_init(lock) LOCKRET(pthread_spin_init(lock, PTHREAD_PROCESS_PRIVATE)) 144 #define lock_quick_destroy(lock) LOCKRET(pthread_spin_destroy(lock)) 145 #define lock_quick_lock(lock) LOCKRET(pthread_spin_lock(lock)) 146 #define lock_quick_unlock(lock) LOCKRET(pthread_spin_unlock(lock)) 156 #define PTHREADSTACKSIZE 2*1024*1024 157 #define PTHREADCREATE(thr, stackrequired, func, arg) do {\ 158 pthread_attr_t attr; \ 160 LOCKRET(pthread_attr_init(&attr)); \ 161 LOCKRET(pthread_attr_getstacksize(&attr, &stacksize)); \ 162 if (stacksize < stackrequired) { \ 163 LOCKRET(pthread_attr_setstacksize(&attr, stackrequired)); \ 164 LOCKRET(pthread_create(thr, &attr, func, arg)); \ 165 LOCKRET(pthread_attr_getstacksize(&attr, &stacksize)); \ 166 verbose(VERB_ALGO, "Thread stack size set to %u", (unsigned)stacksize); \ 167 } else {LOCKRET(pthread_create(thr, NULL, func, arg));} \ 170 #define ub_thread_create(thr, func, arg) PTHREADCREATE(thr, PTHREADSTACKSIZE, func, arg) 172 #define ub_thread_self() pthread_self() 174 #define ub_thread_join(thread) LOCKRET(pthread_join(thread, NULL)) 176 #define ub_thread_key_create(key, f) LOCKRET(pthread_key_create(key, f)) 177 #define ub_thread_key_set(key, v) LOCKRET(pthread_setspecific(key, v)) 178 #define ub_thread_key_get(key) pthread_getspecific(key) 181 #ifdef HAVE_SOLARIS_THREADS 188 #define lock_rw_init(lock) LOCKRET(rwlock_init(lock, USYNC_THREAD, NULL)) 189 #define lock_rw_destroy(lock) LOCKRET(rwlock_destroy(lock)) 190 #define lock_rw_rdlock(lock) LOCKRET(rw_rdlock(lock)) 191 #define lock_rw_wrlock(lock) LOCKRET(rw_wrlock(lock)) 192 #define lock_rw_unlock(lock) LOCKRET(rw_unlock(lock)) 196 #define lock_basic_init(lock) LOCKRET(mutex_init(lock, USYNC_THREAD, NULL)) 197 #define lock_basic_destroy(lock) LOCKRET(mutex_destroy(lock)) 198 #define lock_basic_lock(lock) LOCKRET(mutex_lock(lock)) 199 #define lock_basic_unlock(lock) LOCKRET(mutex_unlock(lock)) 203 #define lock_quick_init(lock) LOCKRET(mutex_init(lock, USYNC_THREAD, NULL)) 204 #define lock_quick_destroy(lock) LOCKRET(mutex_destroy(lock)) 205 #define lock_quick_lock(lock) LOCKRET(mutex_lock(lock)) 206 #define lock_quick_unlock(lock) LOCKRET(mutex_unlock(lock)) 210 #define ub_thread_create(thr, func, arg) LOCKRET(thr_create(NULL, NULL, func, arg, NULL, thr)) 211 #define ub_thread_self() thr_self() 212 #define ub_thread_join(thread) LOCKRET(thr_join(thread, NULL, NULL)) 214 #define ub_thread_key_create(key, f) LOCKRET(thr_keycreate(key, f)) 215 #define ub_thread_key_set(key, v) LOCKRET(thr_setspecific(key, v)) 221 #ifdef HAVE_WINDOWS_THREADS 226 #define lock_rw_init(lock) lock_basic_init(lock) 227 #define lock_rw_destroy(lock) lock_basic_destroy(lock) 228 #define lock_rw_rdlock(lock) lock_basic_lock(lock) 229 #define lock_rw_wrlock(lock) lock_basic_lock(lock) 230 #define lock_rw_unlock(lock) lock_basic_unlock(lock) 241 #define lock_quick_init(lock) lock_basic_init(lock) 242 #define lock_quick_destroy(lock) lock_basic_destroy(lock) 243 #define lock_quick_lock(lock) lock_basic_lock(lock) 244 #define lock_quick_unlock(lock) lock_basic_unlock(lock) 259 #define THREADS_DISABLED 1 262 #define lock_rw_init(lock) 263 #define lock_rw_destroy(lock) 264 #define lock_rw_rdlock(lock) 265 #define lock_rw_wrlock(lock) 266 #define lock_rw_unlock(lock) 270 #define lock_basic_init(lock) 271 #define lock_basic_destroy(lock) 272 #define lock_basic_lock(lock) 273 #define lock_basic_unlock(lock) 277 #define lock_quick_init(lock) 278 #define lock_quick_destroy(lock) 279 #define lock_quick_lock(lock) 280 #define lock_quick_unlock(lock) 286 #define ub_thread_create(thr, func, arg) \ 287 ub_thr_fork_create(thr, func, arg) 288 #define ub_thread_self() getpid() 289 #define ub_thread_join(thread) ub_thr_fork_wait(thread) 293 #define ub_thread_key_create(key, f) (*(key)) = NULL 294 #define ub_thread_key_set(key, v) (key) = (v) 295 #define ub_thread_key_get(key) (key) #define ub_thread_join(thread)
#define lock_basic_destroy(lock)
#define ub_thread_key_get(key)
void ub_thread_sig_unblock(int sig)
#define lock_basic_lock(lock)
#define ub_thread_key_set(key, v)
#define ub_thread_create(thr, func, arg)
#define ub_thread_key_create(key, f)
#define lock_basic_init(lock)
void ub_thr_fork_wait(ub_thread_type thread)
void * ub_thread_key_type
#define lock_basic_unlock(lock)
void ub_thread_blocksigs(void)
void ub_thr_fork_create(ub_thread_type *thr, void *(*func)(void *), void *arg)