File Coverage

/usr/include/c++/5/ext/atomicity.h
Criterion Covered Total %
statement 11 19 57.8
branch 2 4 50.0
condition n/a
subroutine n/a
pod n/a
total 13 23 56.5


line stmt bran cond sub pod time code
1             // Support for atomic operations -*- C++ -*-
2              
3             // Copyright (C) 2004-2015 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             // .
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             #pragma GCC system_header
33              
34             #include
35             #include
36             #include
37              
38             namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
39             {
40             _GLIBCXX_BEGIN_NAMESPACE_VERSION
41              
42             // Functions for portable atomic access.
43             // To abstract locking primitives across all thread policies, use:
44             // __exchange_and_add_dispatch
45             // __atomic_add_dispatch
46             #ifdef _GLIBCXX_ATOMIC_BUILTINS
47             static inline _Atomic_word
48 1503           __exchange_and_add(volatile _Atomic_word* __mem, int __val)
49 1503           { return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
50              
51             static inline void
52 1403           __atomic_add(volatile _Atomic_word* __mem, int __val)
53 1403           { __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
54             #else
55             _Atomic_word
56             __attribute__ ((__unused__))
57             __exchange_and_add(volatile _Atomic_word*, int) throw ();
58              
59             void
60             __attribute__ ((__unused__))
61             __atomic_add(volatile _Atomic_word*, int) throw ();
62             #endif
63              
64             static inline _Atomic_word
65 0           __exchange_and_add_single(_Atomic_word* __mem, int __val)
66             {
67 0           _Atomic_word __result = *__mem;
68 0           *__mem += __val;
69 0           return __result;
70             }
71              
72             static inline void
73 0           __atomic_add_single(_Atomic_word* __mem, int __val)
74 0           { *__mem += __val; }
75              
76             static inline _Atomic_word
77             __attribute__ ((__unused__))
78 1503           __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
79             {
80             #ifdef __GTHREADS
81 1503 50         if (__gthread_active_p())
82 1503           return __exchange_and_add(__mem, __val);
83             else
84 0           return __exchange_and_add_single(__mem, __val);
85             #else
86             return __exchange_and_add_single(__mem, __val);
87             #endif
88             }
89              
90             static inline void
91             __attribute__ ((__unused__))
92 1403           __atomic_add_dispatch(_Atomic_word* __mem, int __val)
93             {
94             #ifdef __GTHREADS
95 1403 50         if (__gthread_active_p())
96 1403           __atomic_add(__mem, __val);
97             else
98 0           __atomic_add_single(__mem, __val);
99             #else
100             __atomic_add_single(__mem, __val);
101             #endif
102 1403           }
103              
104             _GLIBCXX_END_NAMESPACE_VERSION
105             } // namespace
106              
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.
110             #ifndef _GLIBCXX_READ_MEM_BARRIER
111             #define _GLIBCXX_READ_MEM_BARRIER __asm __volatile ("":::"memory")
112             #endif
113             #ifndef _GLIBCXX_WRITE_MEM_BARRIER
114             #define _GLIBCXX_WRITE_MEM_BARRIER __asm __volatile ("":::"memory")
115             #endif
116              
117             #endif