]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/include/ext/atomicity.h
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / include / ext / atomicity.h
CommitLineData
2e362c74 1// Support for atomic operations -*- C++ -*-
2c5d0ae8 2
a5544970 3// Copyright (C) 2004-2019 Free Software Foundation, Inc.
2c5d0ae8
BK
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
748086b7 8// Free Software Foundation; either version 3, or (at your option)
2c5d0ae8
BK
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
748086b7
JJ
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.
2c5d0ae8 19
748086b7
JJ
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/>.
2c5d0ae8 24
f910786b
BK
25/** @file ext/atomicity.h
26 * This file is a GNU extension to the Standard C++ Library.
0aa06b18
BK
27 */
28
2c5d0ae8
BK
29#ifndef _GLIBCXX_ATOMICITY_H
30#define _GLIBCXX_ATOMICITY_H 1
31
aeb1f2be
PC
32#pragma GCC system_header
33
3cbc7af0 34#include <bits/c++config.h>
b7ee72de 35#include <bits/gthr.h>
2c5d0ae8 36#include <bits/atomic_word.h>
3cbc7af0 37
12ffa228
BK
38namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
39{
40_GLIBCXX_BEGIN_NAMESPACE_VERSION
3cbc7af0 41
2e362c74 42 // Functions for portable atomic access.
ee5ca789 43 // To abstract locking primitives across all thread policies, use:
2e362c74
BK
44 // __exchange_and_add_dispatch
45 // __atomic_add_dispatch
a152e96f 46#ifdef _GLIBCXX_ATOMIC_BUILTINS
1b98c24e
BK
47 static inline _Atomic_word
48 __exchange_and_add(volatile _Atomic_word* __mem, int __val)
7dcbaaa9 49 { return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
1b98c24e
BK
50
51 static inline void
52 __atomic_add(volatile _Atomic_word* __mem, int __val)
7dcbaaa9 53 { __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
1b98c24e 54#else
b7ee72de 55 _Atomic_word
2c5d0ae8 56 __attribute__ ((__unused__))
09f2a1e4 57 __exchange_and_add(volatile _Atomic_word*, int) throw ();
2c5d0ae8
BK
58
59 void
60 __attribute__ ((__unused__))
09f2a1e4 61 __atomic_add(volatile _Atomic_word*, int) throw ();
1b98c24e 62#endif
9268b7cb 63
b7ee72de 64 static inline _Atomic_word
b93d5ca9 65 __exchange_and_add_single(_Atomic_word* __mem, int __val)
b7ee72de
PC
66 {
67 _Atomic_word __result = *__mem;
68 *__mem += __val;
69 return __result;
70 }
71
72 static inline void
b93d5ca9 73 __atomic_add_single(_Atomic_word* __mem, int __val)
b7ee72de
PC
74 { *__mem += __val; }
75
76 static inline _Atomic_word
77 __attribute__ ((__unused__))
b93d5ca9 78 __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
b7ee72de
PC
79 {
80#ifdef __GTHREADS
b7ee72de 81 if (__gthread_active_p())
701a3eee 82 return __exchange_and_add(__mem, __val);
b7ee72de
PC
83 else
84 return __exchange_and_add_single(__mem, __val);
b7ee72de 85#else
b7ee72de 86 return __exchange_and_add_single(__mem, __val);
b7ee72de
PC
87#endif
88 }
89
90 static inline void
91 __attribute__ ((__unused__))
b93d5ca9 92 __atomic_add_dispatch(_Atomic_word* __mem, int __val)
b7ee72de
PC
93 {
94#ifdef __GTHREADS
b7ee72de 95 if (__gthread_active_p())
701a3eee 96 __atomic_add(__mem, __val);
b7ee72de
PC
97 else
98 __atomic_add_single(__mem, __val);
b7ee72de 99#else
b7ee72de 100 __atomic_add_single(__mem, __val);
b7ee72de
PC
101#endif
102 }
103
12ffa228
BK
104_GLIBCXX_END_NAMESPACE_VERSION
105} // namespace
2c5d0ae8 106
b93d5ca9
BK
107// Even if the CPU doesn't need a memory barrier, we need to ensure
108// that the compiler doesn't reorder memory accesses across the
109// barriers.
445cf5eb 110#ifndef _GLIBCXX_READ_MEM_BARRIER
57e6d9be 111#define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE)
445cf5eb
JM
112#endif
113#ifndef _GLIBCXX_WRITE_MEM_BARRIER
57e6d9be 114#define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE)
445cf5eb
JM
115#endif
116
2c5d0ae8 117#endif