1 /* 2 * Copyright 2003-2007, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef _TLS_H 6 #define _TLS_H 7 8 9 #include <BeBuild.h> 10 #include <SupportDefs.h> 11 12 13 /* A maximum of 64 keys is allowed to store in TLS - the key is reserved 14 * process-wide. Note that tls_allocate() will return B_NO_MEMORY if you 15 * try to exceed this limit. 16 */ 17 #define TLS_MAX_KEYS 64 18 19 20 #ifdef __cplusplus 21 extern "C" { 22 #endif 23 24 extern int32 tls_allocate(void); 25 26 #if !_NO_INLINE_ASM && __INTEL__ && __GNUC__ 27 28 static inline void * 29 tls_get(int32 index) 30 { 31 void *ret; 32 __asm__ __volatile__ ( 33 "movl %%fs:(,%%edx, 4), %%eax \n\t" 34 : "=a"(ret) : "d"(index) ); 35 return ret; 36 } 37 38 static inline void ** 39 tls_address(int32 index) 40 { 41 void **ret; 42 __asm__ __volatile__ ( 43 "movl %%fs:0, %%eax \n\t" 44 "leal (%%eax, %%edx, 4), %%eax \n\t" 45 : "=a"(ret) : "d"(index) ); 46 return ret; 47 } 48 49 static inline void 50 tls_set(int32 index, void *value) 51 { 52 __asm__ __volatile__ ( 53 "movl %%eax, %%fs:(,%%edx, 4) \n\t" 54 : : "d"(index), "a"(value) ); 55 } 56 57 #else 58 59 extern void *tls_get(int32 index); 60 extern void **tls_address(int32 index); 61 extern void tls_set(int32 index, void *value); 62 63 #endif 64 65 #ifdef __cplusplus 66 } 67 #endif 68 69 #endif /* _TLS_H */ 70