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