]> 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
72de368c 1// Support for atomic operations -*- C++ -*-
94540c6b 2
f1717362 3// Copyright (C) 2004-2016 Free Software Foundation, Inc.
94540c6b 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
6bc9506f 8// Free Software Foundation; either version 3, or (at your option)
94540c6b 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
6bc9506f 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.
94540c6b 19
6bc9506f 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/>.
94540c6b 24
5846aeac 25/** @file ext/atomicity.h
26 * This file is a GNU extension to the Standard C++ Library.
b2a66747 27 */
28
94540c6b 29#ifndef _GLIBCXX_ATOMICITY_H
30#define _GLIBCXX_ATOMICITY_H 1
31
a440362f 32#pragma GCC system_header
33
1069247d 34#include <bits/c++config.h>
c360b175 35#include <bits/gthr.h>
94540c6b 36#include <bits/atomic_word.h>
1069247d 37
2948dd21 38namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
39{
40_GLIBCXX_BEGIN_NAMESPACE_VERSION
1069247d 41
72de368c 42 // Functions for portable atomic access.
fa826926 43 // To abstract locking primitives across all thread policies, use:
72de368c 44 // __exchange_and_add_dispatch
45 // __atomic_add_dispatch
06bc5cca 46#ifdef _GLIBCXX_ATOMIC_BUILTINS
6b1464a3 47 static inline _Atomic_word
48 __exchange_and_add(volatile _Atomic_word* __mem, int __val)
ec9b7e8a 49 { return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
6b1464a3 50
51 static inline void
52 __atomic_add(volatile _Atomic_word* __mem, int __val)
ec9b7e8a 53 { __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
6b1464a3 54#else
c360b175 55 _Atomic_word
94540c6b 56 __attribute__ ((__unused__))
e49af22b 57 __exchange_and_add(volatile _Atomic_word*, int) throw ();
94540c6b 58
59 void
60 __attribute__ ((__unused__))
e49af22b 61 __atomic_add(volatile _Atomic_word*, int) throw ();
6b1464a3 62#endif
aa475990 63
c360b175 64 static inline _Atomic_word
cce6f477 65 __exchange_and_add_single(_Atomic_word* __mem, int __val)
c360b175 66 {
67 _Atomic_word __result = *__mem;
68 *__mem += __val;
69 return __result;
70 }
71
72 static inline void
cce6f477 73 __atomic_add_single(_Atomic_word* __mem, int __val)
c360b175 74 { *__mem += __val; }
75
76 static inline _Atomic_word
77 __attribute__ ((__unused__))
cce6f477 78 __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
c360b175 79 {
80#ifdef __GTHREADS
c360b175 81 if (__gthread_active_p())
3ba82d60 82 return __exchange_and_add(__mem, __val);
c360b175 83 else
84 return __exchange_and_add_single(__mem, __val);
c360b175 85#else
c360b175 86 return __exchange_and_add_single(__mem, __val);
c360b175 87#endif
88 }
89
90 static inline void
91 __attribute__ ((__unused__))
cce6f477 92 __atomic_add_dispatch(_Atomic_word* __mem, int __val)
c360b175 93 {
94#ifdef __GTHREADS
c360b175 95 if (__gthread_active_p())
3ba82d60 96 __atomic_add(__mem, __val);
c360b175 97 else
98 __atomic_add_single(__mem, __val);
c360b175 99#else
c360b175 100 __atomic_add_single(__mem, __val);
c360b175 101#endif
102 }
103
2948dd21 104_GLIBCXX_END_NAMESPACE_VERSION
105} // namespace
94540c6b 106
cce6f477 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.
2ca3d426 110#ifndef _GLIBCXX_READ_MEM_BARRIER
60be3999 111#define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE)
2ca3d426 112#endif
113#ifndef _GLIBCXX_WRITE_MEM_BARRIER
60be3999 114#define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE)
2ca3d426 115#endif
116
94540c6b 117#endif