(root)/
glibc-2.38/
sysdeps/
generic/
libc-tsd.h
       1  /* libc-internal interface for thread-specific data.  Stub or TLS version.
       2     Copyright (C) 1998-2023 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
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the 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; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #ifndef _GENERIC_LIBC_TSD_H
      20  #define _GENERIC_LIBC_TSD_H 1
      21  
      22  /* This file defines the following macros for accessing a small fixed
      23     set of thread-specific `void *' data used only internally by libc.
      24  
      25     __libc_tsd_define(CLASS, TYPE, KEY)	-- Define or declare a datum with TYPE
      26  					   for KEY.  CLASS can be `static' for
      27  					   keys used in only one source file,
      28  					   empty for global definitions, or
      29  					   `extern' for global declarations.
      30     __libc_tsd_address(TYPE, KEY)	-- Return the `TYPE *' pointing to
      31  					   the current thread's datum for KEY.
      32     __libc_tsd_get(TYPE, KEY)		-- Return the `TYPE' datum for KEY.
      33     __libc_tsd_set(TYPE, KEY, VALUE)	-- Set the datum for KEY to VALUE.
      34  
      35     The set of available KEY's will usually be provided as an enum,
      36     and contains (at least):
      37  		_LIBC_TSD_KEY_MALLOC
      38  		_LIBC_TSD_KEY_DL_ERROR
      39  		_LIBC_TSD_KEY_RPC_VARS
      40     All uses must be the literal _LIBC_TSD_* name in the __libc_tsd_* macros.
      41     Some implementations may not provide any enum at all and instead
      42     using string pasting in the macros.  */
      43  
      44  #include <tls.h>
      45  
      46  /* When full support for __thread variables is available, this interface is
      47     just a trivial wrapper for it.  Without TLS, this is the generic/stub
      48     implementation for wholly single-threaded systems.
      49  
      50     We don't define an enum for the possible key values, because the KEYs
      51     translate directly into variables by macro magic.  */
      52  
      53  #define __libc_tsd_define(CLASS, TYPE, KEY)	\
      54    CLASS __thread TYPE __libc_tsd_##KEY attribute_tls_model_ie;
      55  
      56  #define __libc_tsd_address(TYPE, KEY)		(&__libc_tsd_##KEY)
      57  #define __libc_tsd_get(TYPE, KEY)		(__libc_tsd_##KEY)
      58  #define __libc_tsd_set(TYPE, KEY, VALUE)	(__libc_tsd_##KEY = (VALUE))
      59  
      60  #endif	/* libc-tsd.h */