Warning: That file was not part of the compilation database. It may have many parsing errors.

1/* Definition for thread-local data handling. NPTL/Alpha version.
2 Copyright (C) 2003-2019 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 <http://www.gnu.org/licenses/>. */
18
19#ifndef _TLS_H
20#define _TLS_H 1
21
22# include <dl-sysdep.h>
23
24#ifndef __ASSEMBLER__
25# include <stdbool.h>
26# include <stddef.h>
27# include <stdint.h>
28# include <dl-dtv.h>
29
30/* Get system call information. */
31# include <sysdep.h>
32
33/* The TP points to the start of the thread blocks. */
34# define TLS_DTV_AT_TP 1
35# define TLS_TCB_AT_TP 0
36
37/* Get the thread descriptor definition. */
38# include <nptl/descr.h>
39
40typedef struct
41{
42 dtv_t *dtv;
43 void *__private;
44} tcbhead_t;
45
46/* This is the size of the initial TCB. */
47# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
48
49/* Alignment requirements for the initial TCB. */
50# define TLS_INIT_TCB_ALIGN 16
51
52/* This is the size of the TCB. */
53# define TLS_TCB_SIZE sizeof (tcbhead_t)
54
55/* This is the size we need before TCB. */
56# define TLS_PRE_TCB_SIZE sizeof (struct pthread)
57
58/* Alignment requirements for the TCB. */
59# define TLS_TCB_ALIGN 16
60
61/* Install the dtv pointer. The pointer passed is to the element with
62 index -1 which contain the length. */
63# define INSTALL_DTV(tcbp, dtvp) \
64 (((tcbhead_t *) (tcbp))->dtv = (dtvp) + 1)
65
66/* Install new dtv for current thread. */
67# define INSTALL_NEW_DTV(dtv) \
68 (THREAD_DTV() = (dtv))
69
70/* Return dtv of given thread descriptor. */
71# define GET_DTV(tcbp) \
72 (((tcbhead_t *) (tcbp))->dtv)
73
74/* Code to initially initialize the thread pointer. This might need
75 special attention since 'errno' is not yet available and if the
76 operation can cause a failure 'errno' must not be touched. */
77# define TLS_INIT_TP(tcbp) \
78 (__builtin_set_thread_pointer ((void *)(tcbp)), NULL)
79
80/* Value passed to 'clone' for initialization of the thread register. */
81# define TLS_DEFINE_INIT_TP(tp, pd) void *tp = (pd) + 1
82
83/* Return the address of the dtv for the current thread. */
84# define THREAD_DTV() \
85 (((tcbhead_t *) __builtin_thread_pointer ())->dtv)
86
87/* Return the thread descriptor for the current thread. */
88# define THREAD_SELF \
89 ((struct pthread *)__builtin_thread_pointer () - 1)
90
91/* Magic for libthread_db to know how to do THREAD_SELF. */
92# define DB_THREAD_SELF \
93 REGISTER (64, 64, 32 * 8, -sizeof (struct pthread))
94
95/* Access to data in the thread descriptor is easy. */
96#define THREAD_GETMEM(descr, member) \
97 descr->member
98#define THREAD_GETMEM_NC(descr, member, idx) \
99 descr->member[idx]
100#define THREAD_SETMEM(descr, member, value) \
101 descr->member = (value)
102#define THREAD_SETMEM_NC(descr, member, idx, value) \
103 descr->member[idx] = (value)
104
105/* Get and set the global scope generation counter in struct pthread. */
106#define THREAD_GSCOPE_IN_TCB 1
107#define THREAD_GSCOPE_FLAG_UNUSED 0
108#define THREAD_GSCOPE_FLAG_USED 1
109#define THREAD_GSCOPE_FLAG_WAIT 2
110#define THREAD_GSCOPE_RESET_FLAG() \
111 do \
112 { int __res \
113 = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
114 THREAD_GSCOPE_FLAG_UNUSED); \
115 if (__res == THREAD_GSCOPE_FLAG_WAIT) \
116 lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \
117 } \
118 while (0)
119#define THREAD_GSCOPE_SET_FLAG() \
120 do \
121 { \
122 THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
123 atomic_write_barrier (); \
124 } \
125 while (0)
126#define THREAD_GSCOPE_WAIT() \
127 GL(dl_wait_lookup_done) ()
128
129#else /* __ASSEMBLER__ */
130# include <tcb-offsets.h>
131#endif /* __ASSEMBLER__ */
132
133#endif /* tls.h */
134

Warning: That file was not part of the compilation database. It may have many parsing errors.