GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/util/atomic.h
Date: 2026-08-30 02:40:36
Exec Total Coverage
Lines: 41 43 95.3%
Branches: 8 8 100.0%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 *
4 * Defines wrapper functions for atomic integer operations. Atomic operations
5 * are handled by GCC.
6 */
7
8 #ifndef CVMFS_UTIL_ATOMIC_H_
9 #define CVMFS_UTIL_ATOMIC_H_
10
11 #include <stdint.h>
12
13 #ifdef CVMFS_NAMESPACE_GUARD
14 namespace CVMFS_NAMESPACE_GUARD {
15 #endif
16
17 typedef int32_t atomic_int32;
18 typedef int64_t atomic_int64;
19
20 14275058 static void inline __attribute__((used)) atomic_init32(atomic_int32 *a) {
21 14275058 *a = 0;
22 14275058 }
23
24 11640075 static void inline __attribute__((used)) atomic_init64(atomic_int64 *a) {
25 11640075 *a = 0;
26 11640075 }
27
28 2869693532 static int32_t inline __attribute__((used)) atomic_read32(atomic_int32 *a) {
29 2869693532 return __sync_fetch_and_add(a, 0);
30 }
31
32 2121788490 static int64_t inline __attribute__((used)) atomic_read64(atomic_int64 *a) {
33 2121788490 return __sync_fetch_and_add(a, 0);
34 }
35
36 711149132 static void inline __attribute__((used)) atomic_write32(atomic_int32 *a,
37 int32_t value) {
38
2/2
✓ Branch 1 taken 1297533279 times.
✓ Branch 2 taken 870758449 times.
2008682411 while (!__sync_bool_compare_and_swap(a, atomic_read32(a), value)) {
39 }
40 870758449 }
41
42 671700686 static void inline __attribute__((used)) atomic_write64(atomic_int64 *a,
43 int64_t value) {
44
2/2
✓ Branch 1 taken 1489829418 times.
✓ Branch 2 taken 826572438 times.
2161530104 while (!__sync_bool_compare_and_swap(a, atomic_read64(a), value)) {
45 }
46 826572438 }
47
48 261782332 static void inline __attribute__((used)) atomic_inc32(atomic_int32 *a) {
49 261782332 (void)__sync_fetch_and_add(a, 1);
50 261782332 }
51
52 389271127 static void inline __attribute__((used)) atomic_inc64(atomic_int64 *a) {
53 389271127 (void)__sync_fetch_and_add(a, 1);
54 389271127 }
55
56 198912436 static void inline __attribute__((used)) atomic_dec32(atomic_int32 *a) {
57 198912436 (void)__sync_fetch_and_sub(a, 1);
58 198912436 }
59
60 191202099 static void inline __attribute__((used)) atomic_dec64(atomic_int64 *a) {
61 191202099 (void)__sync_fetch_and_sub(a, 1);
62 191202099 }
63
64 26059396 static int32_t inline __attribute__((used)) atomic_xadd32(atomic_int32 *a,
65 int32_t offset) {
66
2/2
✓ Branch 0 taken 1715780 times.
✓ Branch 1 taken 24343616 times.
26059396 if (offset < 0)
67 1715780 return __sync_fetch_and_sub(a, -offset);
68 24343616 return __sync_fetch_and_add(a, offset);
69 }
70
71 146153115 static int64_t inline __attribute__((used)) atomic_xadd64(atomic_int64 *a,
72 int64_t offset) {
73
2/2
✓ Branch 0 taken 33212019 times.
✓ Branch 1 taken 112941096 times.
146153115 if (offset < 0)
74 33212019 return __sync_fetch_and_sub(a, -offset);
75 112941096 return __sync_fetch_and_add(a, offset);
76 }
77
78 3016775 static bool inline __attribute__((used)) atomic_cas32(atomic_int32 *a,
79 int32_t cmp,
80 int32_t newval) {
81 3016775 return __sync_bool_compare_and_swap(a, cmp, newval);
82 }
83
84 static bool inline __attribute__((used)) atomic_cas64(atomic_int64 *a,
85 int64_t cmp,
86 int64_t newval) {
87 // Clang 3.5 has a bug in optimized __sync_bool_compare_and_swap:
88 // https://bugs.llvm.org//show_bug.cgi?format=multiple&id=21499
89 return __sync_bool_compare_and_swap(a, cmp, newval);
90 }
91
92 708 static void inline __attribute__((used)) MemoryFence() {
93 708 asm __volatile__("" : : : "memory");
94 708 }
95
96 #ifdef CVMFS_NAMESPACE_GUARD
97 } // namespace CVMFS_NAMESPACE_GUARD
98 #endif
99
100 #endif // CVMFS_UTIL_ATOMIC_H_
101