1 /* 2 * Copyright (C) 2008 The Android Open Source Project 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 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #ifndef __BIONIC_PRIVATE_BIONIC_TLS_H_ 30 #define __BIONIC_PRIVATE_BIONIC_TLS_H_ 31 32 #include <sys/cdefs.h> 33 34 #include "bionic_macros.h" 35 #include "__get_tls.h" 36 37 __BEGIN_DECLS 38 39 /** WARNING WARNING WARNING 40 ** 41 ** This header file is *NOT* part of the public Bionic ABI/API 42 ** and should not be used/included by user-serviceable parts of 43 ** the system (e.g. applications). 44 ** 45 ** It is only provided here for the benefit of the system dynamic 46 ** linker and the OpenGL sub-system (which needs to access the 47 ** pre-allocated slot directly for performance reason). 48 **/ 49 50 // Well-known TLS slots. What data goes in which slot is arbitrary unless otherwise noted. 51 enum { 52 TLS_SLOT_SELF = 0, // The kernel requires this specific slot for x86. 53 TLS_SLOT_THREAD_ID, 54 TLS_SLOT_ERRNO, 55 56 // These two aren't used by bionic itself, but allow the graphics code to 57 // access TLS directly rather than using the pthread API. 58 TLS_SLOT_OPENGL_API = 3, 59 TLS_SLOT_OPENGL = 4, 60 61 // This slot is only used to pass information from the dynamic linker to 62 // libc.so when the C library is loaded in to memory. The C runtime init 63 // function will then clear it. Since its use is extremely temporary, 64 // we reuse an existing location that isn't needed during libc startup. 65 TLS_SLOT_BIONIC_PREINIT = TLS_SLOT_OPENGL_API, 66 67 TLS_SLOT_STACK_GUARD = 5, // GCC requires this specific slot for x86. 68 TLS_SLOT_DLERROR, 69 70 // Fast storage for Thread::Current() in ART. 71 TLS_SLOT_ART_THREAD_SELF, 72 73 // Lets TSAN avoid using pthread_getspecific for finding the current thread 74 // state. 75 TLS_SLOT_TSAN, 76 77 BIONIC_TLS_SLOTS // Must come last! 78 }; 79 80 /* 81 * Bionic uses some pthread keys internally. All pthread keys used internally 82 * should be created in constructors, except for keys that may be used in or 83 * before constructors. 84 * 85 * We need to manually maintain the count of pthread keys used internally, but 86 * pthread_test should fail if we forget. 87 * 88 * These are the pthread keys currently used internally by libc: 89 * 90 * basename libc (ThreadLocalBuffer) 91 * dirname libc (ThreadLocalBuffer) 92 * uselocale libc (can be used in constructors) 93 * getmntent_mntent libc (ThreadLocalBuffer) 94 * getmntent_strings libc (ThreadLocalBuffer) 95 * ptsname libc (ThreadLocalBuffer) 96 * ttyname libc (ThreadLocalBuffer) 97 * strerror libc (ThreadLocalBuffer) 98 * strsignal libc (ThreadLocalBuffer) 99 * passwd libc (ThreadLocalBuffer) 100 * group libc (ThreadLocalBuffer) 101 * _res_key libc (constructor in BSD code) 102 */ 103 104 #define LIBC_PTHREAD_KEY_RESERVED_COUNT 12 105 106 /* Internally, jemalloc uses a single key for per thread data. */ 107 #define JEMALLOC_PTHREAD_KEY_RESERVED_COUNT 1 108 #define BIONIC_PTHREAD_KEY_RESERVED_COUNT (LIBC_PTHREAD_KEY_RESERVED_COUNT + JEMALLOC_PTHREAD_KEY_RESERVED_COUNT) 109 110 /* 111 * Maximum number of pthread keys allocated. 112 * This includes pthread keys used internally and externally. 113 */ 114 #define BIONIC_PTHREAD_KEY_COUNT (BIONIC_PTHREAD_KEY_RESERVED_COUNT + PTHREAD_KEYS_MAX) 115 116 __END_DECLS 117 118 #if defined(__cplusplus) 119 class KernelArgumentBlock; 120 extern void __libc_init_main_thread(KernelArgumentBlock&); 121 #endif 122 123 #endif /* __BIONIC_PRIVATE_BIONIC_TLS_H_ */ 124