libstdc++
atomicfwd_c.h
Go to the documentation of this file.
1 // -*- C++ -*- header.
2 
3 // Copyright (C) 2008, 2009
4 // Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
10 // any later version.
11 
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 
17 // Under Section 7 of GPL version 3, you are granted additional
18 // permissions described in the GCC Runtime Library Exception, version
19 // 3.1, as published by the Free Software Foundation.
20 
21 // You should have received a copy of the GNU General Public License and
22 // a copy of the GCC Runtime Library Exception along with this program;
23 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 // <http://www.gnu.org/licenses/>.
25 
26 /** @file bits/atomicfwd_c.h
27  * This is an internal header file, included by other library headers.
28  * You should not attempt to use it directly.
29  */
30 
31 // "C" only bits.
32 
33 #define _ATOMIC_MEMBER_ ((__a)->_M_i)
34 
35  // POD base classes for atomic intgral types.
36  struct __atomic_bool_base
37  {
38  bool _M_i;
39  };
40 
41  struct __atomic_char_base
42  {
43  char _M_i;
44  };
45 
46  struct __atomic_schar_base
47  {
48  signed char _M_i;
49  };
50 
51  struct __atomic_uchar_base
52  {
53  unsigned char _M_i;
54  };
55 
56  struct __atomic_short_base
57  {
58  short _M_i;
59  };
60 
61  struct __atomic_ushort_base
62  {
63  unsigned short _M_i;
64  };
65 
66  struct __atomic_int_base
67  {
68  int _M_i;
69  };
70 
71  struct __atomic_uint_base
72  {
73  unsigned int _M_i;
74  };
75 
76  struct __atomic_long_base
77  {
78  long _M_i;
79  };
80 
81  struct __atomic_ulong_base
82  {
83  unsigned long _M_i;
84  };
85 
86  struct __atomic_llong_base
87  {
88  long long _M_i;
89  };
90 
91  struct __atomic_ullong_base
92  {
93  unsigned long long _M_i;
94  };
95 
96  struct __atomic_wchar_t_base
97  {
98  wchar_t _M_i;
99  };
100 
101  typedef struct __atomic_flag_base atomic_flag;
102  typedef struct __atomic_address_base atomic_address;
103  typedef struct __atomic_bool_base atomic_bool;
104  typedef struct __atomic_char_base atomic_char;
105  typedef struct __atomic_schar_base atomic_schar;
106  typedef struct __atomic_uchar_base atomic_uchar;
107  typedef struct __atomic_short_base atomic_short;
108  typedef struct __atomic_ushort_base atomic_ushort;
109  typedef struct __atomic_int_base atomic_int;
110  typedef struct __atomic_uint_base atomic_uint;
111  typedef struct __atomic_long_base atomic_long;
112  typedef struct __atomic_ulong_base atomic_ulong;
113  typedef struct __atomic_llong_base atomic_llong;
114  typedef struct __atomic_ullong_base atomic_ullong;
115  typedef struct __atomic_wchar_t_base atomic_wchar_t;
116  typedef struct __atomic_short_base atomic_char16_t;
117  typedef struct __atomic_int_base atomic_char32_t;
118 
119 #define atomic_is_lock_free(__a) \
120  false
121 
122 #define atomic_load_explicit(__a, __x) \
123  _ATOMIC_LOAD_(__a, __x)
124 
125 #define atomic_load(__a) \
126  atomic_load_explicit(__a, memory_order_seq_cst)
127 
128 #define atomic_store_explicit(__a, __m, __x) \
129  _ATOMIC_STORE_(__a, __m, __x)
130 
131 #define atomic_store(__a, __m) \
132  atomic_store_explicit(__a, __m, memory_order_seq_cst)
133 
134 #define atomic_exchange_explicit(__a, __m, __x) \
135  _ATOMIC_MODIFY_(__a, =, __m, __x)
136 
137 #define atomic_exchange(__a, __m) \
138  atomic_exchange_explicit(__a, __m, memory_order_seq_cst)
139 
140 #define atomic_compare_exchange_explicit(__a, __e, __m, __x, __y) \
141  _ATOMIC_CMPEXCHNG_(__a, __e, __m, __x)
142 
143 #define atomic_compare_exchange(__a, __e, __m) \
144  _ATOMIC_CMPEXCHNG_(__a, __e, __m, memory_order_seq_cst)
145 
146 #define atomic_fetch_add_explicit(__a, __m, __x) \
147  _ATOMIC_MODIFY_(__a, +=, __m, __x)
148 
149 #define atomic_fetch_add(__a, __m) \
150  atomic_fetch_add_explicit(__a, __m, memory_order_seq_cst)
151 
152 #define atomic_fetch_sub_explicit(__a, __m, __x) \
153  _ATOMIC_MODIFY_(__a, -=, __m, __x)
154 
155 #define atomic_fetch_sub(__a, __m) \
156  atomic_fetch_sub_explicit(__a, __m, memory_order_seq_cst)
157 
158 #define atomic_fetch_and_explicit(__a, __m, __x) \
159  _ATOMIC_MODIFY_(__a, &=, __m, __x)
160 
161 #define atomic_fetch_and(__a, __m) \
162  atomic_fetch_and_explicit(__a, __m, memory_order_seq_cst)
163 
164 #define atomic_fetch_or_explicit(__a, __m, __x) \
165  _ATOMIC_MODIFY_(__a, |=, __m, __x)
166 
167 #define atomic_fetch_or(__a, __m) \
168  atomic_fetch_or_explicit(__a, __m, memory_order_seq_cst)
169 
170 #define atomic_fetch_xor_explicit(__a, __m, __x) \
171  _ATOMIC_MODIFY_(__a, ^=, __m, __x)
172 
173 #define atomic_fetch_xor(__a, __m) \
174  atomic_fetch_xor_explicit(__a, __m, memory_order_seq_cst)