11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* $OpenBSD: thread_private.h,v 1.18 2006/02/22 07:16:31 otto Exp $ */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* PUBLIC DOMAIN: No Rights Reserved. Marco S Hyman <marc@snafu.org> */ 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _THREAD_PRIVATE_H_ 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _THREAD_PRIVATE_H_ 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <pthread.h> 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 100468feb28696751efcddada8de69a622afffdba8Elliott Hughes__BEGIN_DECLS 110468feb28696751efcddada8de69a622afffdba8Elliott Hughes 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This file defines the thread library interface to libc. Thread 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * libraries must implement the functions described here for proper 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * inter-operation with libc. libc contains weak versions of the 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * described functions for operation in a non-threaded environment. 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * helper macro to make unique names in the thread namespace 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define __THREAD_NAME(name) __CONCAT(_thread_tagname_,name) 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct __thread_private_tag_t { 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pthread_mutex_t _private_lock; 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pthread_key_t _private_key; 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _THREAD_PRIVATE_MUTEX(name) \ 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static struct __thread_private_tag_t __THREAD_NAME(name) = { PTHREAD_MUTEX_INITIALIZER, -1 } 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _THREAD_PRIVATE_MUTEX_LOCK(name) \ 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pthread_mutex_lock( &__THREAD_NAME(name)._private_lock ) 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _THREAD_PRIVATE_MUTEX_UNLOCK(name) \ 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pthread_mutex_unlock( &__THREAD_NAME(name)._private_lock ) 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3653c3c271dc9927dd280981fc23409af60f460007Dmitriy Ivanov/* Note that these aren't compatible with the usual OpenBSD ones which lazy-initialize! */ 3753c3c271dc9927dd280981fc23409af60f460007Dmitriy Ivanov#define _MUTEX_LOCK(l) pthread_mutex_lock((pthread_mutex_t*) l) 3853c3c271dc9927dd280981fc23409af60f460007Dmitriy Ivanov#define _MUTEX_UNLOCK(l) pthread_mutex_unlock((pthread_mutex_t*) l) 3953c3c271dc9927dd280981fc23409af60f460007Dmitriy Ivanov 4053c3c271dc9927dd280981fc23409af60f460007Dmitriy Ivanov__LIBC_HIDDEN__ void _thread_atexit_lock(void); 4153c3c271dc9927dd280981fc23409af60f460007Dmitriy Ivanov__LIBC_HIDDEN__ void _thread_atexit_unlock(void); 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 43f2cea021ab2c6d7d7feeb40cca098aa132605876Elliott Hughes#define _ATEXIT_LOCK() _thread_atexit_lock() 44f2cea021ab2c6d7d7feeb40cca098aa132605876Elliott Hughes#define _ATEXIT_UNLOCK() _thread_atexit_unlock() 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 460468feb28696751efcddada8de69a622afffdba8Elliott Hughes__LIBC_HIDDEN__ void _thread_arc4_lock(void); 470468feb28696751efcddada8de69a622afffdba8Elliott Hughes__LIBC_HIDDEN__ void _thread_arc4_unlock(void); 480468feb28696751efcddada8de69a622afffdba8Elliott Hughes 492b67d7dee09852789d9ac7d8972ed6cdb2c18430Elliott Hughes#define _ARC4_LOCK() _thread_arc4_lock() 502b67d7dee09852789d9ac7d8972ed6cdb2c18430Elliott Hughes#define _ARC4_UNLOCK() _thread_arc4_unlock() 512b67d7dee09852789d9ac7d8972ed6cdb2c18430Elliott Hughes#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f)) 520468feb28696751efcddada8de69a622afffdba8Elliott Hughes 530468feb28696751efcddada8de69a622afffdba8Elliott Hughes__END_DECLS 540468feb28696751efcddada8de69a622afffdba8Elliott Hughes 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _THREAD_PRIVATE_H_ */ 56