1 /* libc-internal interface for thread-specific data. LinuxThreads version. 2 Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public License as 7 published by the Free Software Foundation; either version 2.1 of the 8 License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; see the file COPYING.LIB. If 17 not, see <http://www.gnu.org/licenses/>. */ 18 19 #ifndef _BITS_LIBC_TSD_H 20 #define _BITS_LIBC_TSD_H 1 21 22 /* Fast thread-specific data internal to libc. */ 23 enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0, 24 _LIBC_TSD_KEY_DL_ERROR, 25 _LIBC_TSD_KEY_RPC_VARS, 26 _LIBC_TSD_KEY_LOCALE, 27 _LIBC_TSD_KEY_CTYPE_B, 28 _LIBC_TSD_KEY_CTYPE_TOLOWER, 29 _LIBC_TSD_KEY_CTYPE_TOUPPER, 30 _LIBC_TSD_KEY_N }; 31 32 #include <features.h> 33 #include <linuxthreads/internals.h> 34 35 #ifdef __UCLIBC_HAS_TLS__ 36 #include <tls.h> 37 38 /* When __thread works, the generic definition is what we want. */ 39 # include <sysdeps/generic/bits/libc-tsd.h> 40 41 #else 42 43 # include <bits/libc-lock.h> 44 45 # ifndef SHARED 46 extern void ** __pthread_internal_tsd_address (int); 47 extern void *__pthread_internal_tsd_get (int); 48 extern int __pthread_internal_tsd_set (int, const void *); 49 50 weak_extern (__pthread_internal_tsd_address) 51 weak_extern (__pthread_internal_tsd_get) 52 weak_extern (__pthread_internal_tsd_set) 53 # endif 54 55 #define __libc_tsd_define(CLASS, KEY) CLASS void *__libc_tsd_##KEY##_data; 56 #define __libc_tsd_address(KEY) \ 57 __libc_maybe_call2 (pthread_internal_tsd_address, \ 58 (_LIBC_TSD_KEY_##KEY), &__libc_tsd_##KEY##_data) 59 #define __libc_tsd_get(KEY) \ 60 __libc_maybe_call2 (pthread_internal_tsd_get, \ 61 (_LIBC_TSD_KEY_##KEY), __libc_tsd_##KEY##_data) 62 #define __libc_tsd_set(KEY, VALUE) \ 63 __libc_maybe_call2 (pthread_internal_tsd_set, \ 64 (_LIBC_TSD_KEY_##KEY, (VALUE)), \ 65 (__libc_tsd_##KEY##_data = (VALUE), 0)) 66 67 #endif 68 69 #endif /* bits/libc-tsd.h */ 70