aboutsummaryrefslogtreecommitdiff
path: root/AT91SAM7S256/SAM7S256/Include/xtls.h
blob: f85a018680ce9040639e878ef9e8bdbb22cc3fdc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
/* xtls.h internal header */
#ifndef _XTLS
#define _XTLS

#ifndef _SYSTEM_BUILD
#pragma system_include
#endif

#include <xmtx.h>

/* We need to turn off this warning */
#pragma diag_suppress = Pe076

_C_LIB_DECL
typedef void (*_Tlsdtor_t)(void*);
__INTRINSIC int _Atthreadexit(void (*)(void));
__INTRINSIC void _Destroytls(void);

#define _IMPLICIT_EXTERN

#if _COMPILER_TLS
  #define _XTLS_QUAL    _TLS_QUAL
#else /* _COMPILER_TLS */
  #define _XTLS_QUAL
#endif /* _COMPILER_TLS */

#if _GLOBAL_LOCALE
  #define _TLS_LOCK(lock)       _Locksyslock(lock)
  #define _TLS_UNLOCK(lock)     _Unlocksyslock(lock)
#else /* _GLOBAL_LOCALE */
  #define _TLS_LOCK(lock)       (void)0
  #define _TLS_UNLOCK(lock)     (void)0
#endif /* _GLOBAL_LOCALE */

#define _XTLS_DTOR(name)        _Tls_dtor_ ## name
#define _XTLS_GET(name)         _Tls_get_ ## name
#define _XTLS_INIT(name)        _Tls_init_ ## name
#define _XTLS_KEY(name)         _Tls_key_ ## name
#define _XTLS_ONCE(name)        _Tls_once_ ## name
#define _XTLS_REG(name)         _Tls_reg_ ## name
#define _XTLS_SETUP(name)       _Tls_setup_ ## name
#define _XTLS_SETUPX(name)      _Tls_setupx_ ## name

#if _COMPILER_TLS
  #define _CLEANUP(x)   _Atthreadexit(x)
#else /* _COMPILER_TLS */
  #define _CLEANUP(x)   _Atexit(x)
#endif /* _COMPILER_TLS */

#if !_MULTI_THREAD || _GLOBAL_LOCALE || _COMPILER_TLS

  #define _TLS_DATA_DECL(type, name) \
        extern int (*_XTLS_SETUP(name))(void); \
        extern type name

  #define _TLS_DEFINE_INIT(scope, type, name) \
        scope _XTLS_QUAL type name

  #define _TLS_DEFINE_NO_INIT(scope, type, name) \
        scope int (* _XTLS_SETUP(name))(void) = 0

  #define _TLS_DATA_DEF(scope, type, name, init) \
        _TLS_DEFINE_INIT(scope, type, name) = init; \
        _TLS_DEFINE_NO_INIT(scope, type, name)

  #define _TLS_DEFINE_INIT_DT(scope, type, name) \
        _TLS_DEFINE_INIT(scope, type, name)

  #define _TLS_DEFINE_NO_INIT_DT(scope, type, name, dtor) \
        static _Once_t _XTLS_ONCE(name) = _ONCE_T_INIT; \
        static void _XTLS_DTOR(name)(void) \
        { \
        dtor(&(name)); \
        } \
        static void _XTLS_REG(name)(void) \
        { \
        _CLEANUP(_XTLS_DTOR(name)); \
        } \
        static int _XTLS_SETUPX(name)(void) \
        { \
        _Once(&_XTLS_ONCE(name), _XTLS_REG(name)); \
        return 1; \
        } \
        scope int (*_XTLS_SETUP(name))(void) = _XTLS_SETUPX(name)

  #define _TLS_DATA_DEF_DT(scope, type, name, init, dtor) \
        _TLS_DEFINE_INIT_DT(scope, type, name) = init; \
        _TLS_DEFINE_NO_INIT_DT(scope, type, name, dtor)

  #define _TLS_DATA_PTR(name) \
        ((_XTLS_SETUP(name) && _XTLS_SETUP(name)()), (&(name)))

  #define _TLS_ARR_DECL(type, name) \
        extern type name[]

  #define _XTLS_ARR_DEF_INIT(scope, type, name, elts) \
        scope _XTLS_QUAL type name[elts]

  #define _TLS_ARR_DEF(scope, type, name, elts) \
        _XTLS_ARR_DEF_INIT(scope, type, name, elts); \
        _TLS_DEFINE_NO_INIT(scope, type, name)

  #define _TLS_ARR_DEF_DT(scope, type, name, elts, dtor) \
        _XTLS_ARR_DEF_INIT(scope, type, name, elts); \
        _TLS_DEFINE_NO_INIT_DT(scope, type, name, dtor)

  #define _TLS_ARR(name) \
        ((_XTLS_SETUP(name) && _XTLS_SETUP(name)()), (&(name[0])))

#else /* !_MULTI_THREAD || _GLOBAL_LOCALE || _COMPILER_TLS */

  #define _TLS_DATA_DECL(type, name) \
        extern type *_XTLS_GET(name)(void)

  #define _TLS_DEFINE_INIT(scope, type, name) \
        static const type _XTLS_INIT(name)

  #define _XTLS_DEFINE_NO_INIT(scope, type, name, elts, dtor) \
        static _Once_t _XTLS_ONCE(name) = _ONCE_T_INIT; \
        static _Tlskey_t _XTLS_KEY(name); \
        static void _XTLS_SETUP(name)(void) \
        { \
        _Tlsalloc(&_XTLS_KEY(name), dtor); \
        } \
        scope type *_XTLS_GET(name)(void) \
        { \
        type *_Ptr; \
        _Once(&_XTLS_ONCE(name), _XTLS_SETUP(name)); \
        if ((_Ptr = (type *)_Tlsget(_XTLS_KEY(name))) != 0) \
                ; \
        else if ((_Ptr = (type *)calloc(elts, sizeof(type))) == 0) \
                ; \
        else if (_Tlsset(_XTLS_KEY(name), (void*)_Ptr) != 0) \
                free((void*)_Ptr), _Ptr = 0; \
        else \
                *_Ptr = _XTLS_INIT(name); \
        return _Ptr; \
        } \
        extern int _TLS_Dummy

  #define _TLS_DEFINE_NO_INIT(scope, type, name) \
        _XTLS_DEFINE_NO_INIT(scope, type, name, 1, free)

  #define _TLS_DATA_DEF(scope, type, name, init) \
        _TLS_DEFINE_INIT(scope, type, name) = init; \
        _XTLS_DEFINE_NO_INIT(scope, type, name, 1, free)

  #define _TLS_DEFINE_INIT_DT(scope, type, name) \
        _TLS_DEFINE_INIT(scope, type, name)

  #define _XTLS_DEFINE_NO_INIT_DT(scope, type, name, elts, dtor) \
        static void _XTLS_DTOR(name)(void* _Ptr) \
        { \
        (dtor)(_Ptr); \
        free(_Ptr); \
        } \
        _XTLS_DEFINE_NO_INIT(scope, type, name, elts, _XTLS_DTOR(name))

  #define _TLS_DEFINE_NO_INIT_DT(scope, type, name, dtor) \
        _XTLS_DEFINE_NO_INIT_DT(scope, type, name, 1, dtor)

  #define _TLS_DATA_DEF_DT(scope, type, name, init, dtor) \
        _TLS_DEFINE_INIT_DT(scope, type, name) = init; \
        _TLS_DEFINE_NO_INIT_DT(scope, type, name, dtor)

  #define _TLS_DATA_PTR(name) _XTLS_GET(name)()

  #define _TLS_ARR_DECL(type, name) \
        _TLS_DATA_DECL(type, name)

  #define _TLS_ARR_DEF(scope, type, name, elts) \
        _TLS_DEFINE_INIT(scope, type, name) = {0}; \
        _XTLS_DEFINE_NO_INIT(scope, type, name, elts, free)

  #define _TLS_ARR_DEF_DT(scope, type, name, elts, dtor) \
        _TLS_DEFINE_INIT(scope, type, name) = {0}; \
        _XTLS_DEFINE_NO_INIT_DT(scope, type, name, elts, dtor)

  #define _TLS_ARR(name) \
        _XTLS_GET(name)()
#endif /* !_MULTI_THREAD || _GLOBAL_LOCALE || _COMPILER_TLS */
_END_C_LIB_DECL
#endif /* _XTLS */

/*
 * Copyright (c) 1992-2002 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
V3.12:0576 */