Branch data Line data Source code
1 : : // Support for atomic operations -*- C++ -*-
2 : :
3 : : // Copyright (C) 2004-2013 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 : : #include <bits/c++config.h>
33 : : #include <bits/gthr.h>
34 : : #include <bits/atomic_word.h>
35 : :
36 : : namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
37 : : {
38 : : _GLIBCXX_BEGIN_NAMESPACE_VERSION
39 : :
40 : : // Functions for portable atomic access.
41 : : // To abstract locking primitives across all thread policies, use:
42 : : // __exchange_and_add_dispatch
43 : : // __atomic_add_dispatch
44 : : #ifdef _GLIBCXX_ATOMIC_BUILTINS
45 : : static inline _Atomic_word
46 : 0 : __exchange_and_add(volatile _Atomic_word* __mem, int __val)
47 : 0 : { return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
48 : :
49 : : static inline void
50 : : __atomic_add(volatile _Atomic_word* __mem, int __val)
51 : : { __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
52 : : #else
53 : : _Atomic_word
54 : : __attribute__ ((__unused__))
55 : : __exchange_and_add(volatile _Atomic_word*, int) throw ();
56 : :
57 : : void
58 : : __attribute__ ((__unused__))
59 : : __atomic_add(volatile _Atomic_word*, int) throw ();
60 : : #endif
61 : :
62 : : static inline _Atomic_word
63 : 0 : __exchange_and_add_single(_Atomic_word* __mem, int __val)
64 : : {
65 : 0 : _Atomic_word __result = *__mem;
66 : 0 : *__mem += __val;
67 : 0 : return __result;
68 : : }
69 : :
70 : : static inline void
71 : : __atomic_add_single(_Atomic_word* __mem, int __val)
72 : : { *__mem += __val; }
73 : :
74 : : static inline _Atomic_word
75 : : __attribute__ ((__unused__))
76 : 0 : __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
77 : : {
78 : : #ifdef __GTHREADS
79 [ # # ]: 0 : if (__gthread_active_p())
80 : 0 : return __exchange_and_add(__mem, __val);
81 : : else
82 : 0 : return __exchange_and_add_single(__mem, __val);
83 : : #else
84 : : return __exchange_and_add_single(__mem, __val);
85 : : #endif
86 : : }
87 : :
88 : : static inline void
89 : : __attribute__ ((__unused__))
90 : : __atomic_add_dispatch(_Atomic_word* __mem, int __val)
91 : : {
92 : : #ifdef __GTHREADS
93 : : if (__gthread_active_p())
94 : : __atomic_add(__mem, __val);
95 : : else
96 : : __atomic_add_single(__mem, __val);
97 : : #else
98 : : __atomic_add_single(__mem, __val);
99 : : #endif
100 : : }
101 : :
102 : : _GLIBCXX_END_NAMESPACE_VERSION
103 : : } // namespace
104 : :
105 : : // Even if the CPU doesn't need a memory barrier, we need to ensure
106 : : // that the compiler doesn't reorder memory accesses across the
107 : : // barriers.
108 : : #ifndef _GLIBCXX_READ_MEM_BARRIER
109 : : #define _GLIBCXX_READ_MEM_BARRIER __asm __volatile ("":::"memory")
110 : : #endif
111 : : #ifndef _GLIBCXX_WRITE_MEM_BARRIER
112 : : #define _GLIBCXX_WRITE_MEM_BARRIER __asm __volatile ("":::"memory")
113 : : #endif
114 : :
115 : : #endif
|