libstdc++
atomicity.h
Go to the documentation of this file.
1 // Support for atomic operations -*- C++ -*-
2 
3 // Copyright (C) 2004-2025 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /** @file ext/atomicity.h
26  * This file is a GNU extension to the Standard C++ Library.
27  */
28 
29 #ifndef _GLIBCXX_ATOMICITY_H
30 #define _GLIBCXX_ATOMICITY_H 1
31 
32 #ifdef _GLIBCXX_SYSHDR
33 #pragma GCC system_header
34 #endif
35 
36 #include <bits/c++config.h>
37 #include <bits/gthr.h>
38 #include <bits/atomic_word.h>
39 #if __has_include(<sys/single_threaded.h>)
40 # include <sys/single_threaded.h>
41 #endif
42 
43 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
44 {
45 _GLIBCXX_BEGIN_NAMESPACE_VERSION
46 
47  __attribute__((__always_inline__))
48  inline bool
49  __is_single_threaded() _GLIBCXX_NOTHROW
50  {
51 #ifndef __GTHREADS
52  return true;
53 #elif __has_include(<sys/single_threaded.h>)
54  return ::__libc_single_threaded;
55 #else
56  return !__gthread_active_p();
57 #endif
58  }
59 
60  // Functions for portable atomic access.
61  // To abstract locking primitives across all thread policies, use:
62  // __exchange_and_add_dispatch
63  // __atomic_add_dispatch
64 #ifdef _GLIBCXX_ATOMIC_BUILTINS
65  inline _Atomic_word
66  __attribute__((__always_inline__))
67  __exchange_and_add(volatile _Atomic_word* __mem, int __val)
68  { return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
69 
70  inline void
71  __attribute__((__always_inline__))
72  __atomic_add(volatile _Atomic_word* __mem, int __val)
73  { __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
74 #else
75  _Atomic_word
76  __exchange_and_add(volatile _Atomic_word*, int) _GLIBCXX_NOTHROW;
77 
78  void
79  __atomic_add(volatile _Atomic_word*, int) _GLIBCXX_NOTHROW;
80 #endif
81 
82  inline _Atomic_word
83  __attribute__((__always_inline__))
84  __exchange_and_add_single(_Atomic_word* __mem, int __val)
85  {
86  _Atomic_word __result = *__mem;
87  *__mem += __val;
88  return __result;
89  }
90 
91  inline void
92  __attribute__((__always_inline__))
93  __atomic_add_single(_Atomic_word* __mem, int __val)
94  { *__mem += __val; }
95 
96  inline _Atomic_word
97  __attribute__ ((__always_inline__))
98  __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
99  {
100  if (__is_single_threaded())
101  return __exchange_and_add_single(__mem, __val);
102  else
103  return __exchange_and_add(__mem, __val);
104  }
105 
106  inline void
107  __attribute__ ((__always_inline__))
108  __atomic_add_dispatch(_Atomic_word* __mem, int __val)
109  {
110  if (__is_single_threaded())
111  __atomic_add_single(__mem, __val);
112  else
113  __atomic_add(__mem, __val);
114  }
115 
116 _GLIBCXX_END_NAMESPACE_VERSION
117 } // namespace
118 
119 // Even if the CPU doesn't need a memory barrier, we need to ensure
120 // that the compiler doesn't reorder memory accesses across the
121 // barriers.
122 #ifndef _GLIBCXX_READ_MEM_BARRIER
123 #define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE)
124 #endif
125 #ifndef _GLIBCXX_WRITE_MEM_BARRIER
126 #define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE)
127 #endif
128 
129 #endif
GNU extensions for public use.