Make atomics a hard-dep. (#12730)
They are used extensively throughout our code base, and not having support for them does not generate a thread-safe agent.
vkalintiris committed
May 2, 2022 at 17:59 UTC
b6d2a3662dfb683e9e95203ef3b21f8e31238b06
9 files changed
+6
-183
Makefile.am
+3
-11
@@ -28,7 +28,6 @@ EXTRA_DIST = \
28
.eslintrc \
29
.github/CODEOWNERS \
30
build/m4/jemalloc.m4 \
31
- build/m4/ax_c___atomic.m4 \
31
build/m4/ax_check_enable_debug.m4 \
32
build/m4/ax_c_mallinfo.m4 \
33
build/m4/ax_gcc_func_attribute.m4 \
@@ -941,22 +940,15 @@ if ENABLE_ML_TESTS
940
$(NULL)
941
endif
942
944
-if ENABLE_CXX_LINKER
945
- netdata_LINK = $(CXXLD) $(CXXFLAGS) $(LDFLAGS) -o $@
946
-else
947
- netdata_LINK = $(CCLD) $(CFLAGS) $(LDFLAGS) -o $@
948
-endif
943
+netdata_LINK = $(CXXLD) $(CXXFLAGS) $(LDFLAGS) -o $@
944
945
sbin_PROGRAMS += netdatacli
946
netdatacli_SOURCES = $(NETDATACLI_FILES)
947
netdatacli_LDADD = \
948
$(NETDATA_COMMON_LIBS) \
949
$(NULL)
955
-if ENABLE_CXX_LINKER
956
- netdatacli_LINK = $(CXXLD) $(CXXFLAGS) $(LDFLAGS) -o $@
957
-else
958
- netdatacli_LINK = $(CCLD) $(CFLAGS) $(LDFLAGS) -o $@
959
-endif
950
+
951
+netdatacli_LINK = $(CXXLD) $(CXXFLAGS) $(LDFLAGS) -o $@
952
953
if ENABLE_PLUGIN_APPS
954
plugins_PROGRAMS += apps.plugin
aclk/aclk_util.c
-11
@@ -65,17 +65,6 @@ int aclk_env_has_capa(const char *capa)
65
66
#ifdef ACLK_LOG_CONVERSATION_DIR
67
volatile int aclk_conversation_log_counter = 0;
68
-#if !defined(HAVE_C___ATOMIC)
69
-netdata_mutex_t aclk_conversation_log_mutex = NETDATA_MUTEX_INITIALIZER;
70
-int aclk_get_conv_log_next()
71
-{
72
- int ret;
73
- netdata_mutex_lock(&aclk_conversation_log_mutex);
74
- ret = aclk_conversation_log_counter++;
75
- netdata_mutex_unlock(&aclk_conversation_log_mutex);
76
- return ret;
77
-}
78
-#endif
68
#endif
69
70
#define ACLK_TOPIC_PREFIX "/agent/"
aclk/aclk_util.h
-6
@@ -99,13 +99,7 @@ void free_topic_cache(void);
99
100
#ifdef ACLK_LOG_CONVERSATION_DIR
101
extern volatile int aclk_conversation_log_counter;
102
-#if defined(HAVE_C___ATOMIC)
102
#define ACLK_GET_CONV_LOG_NEXT() __atomic_fetch_add(&aclk_conversation_log_counter, 1, __ATOMIC_SEQ_CST)
104
-#else
105
-extern netdata_mutex_t aclk_conversation_log_mutex;
106
-int aclk_get_conv_log_next();
107
-#define ACLK_GET_CONV_LOG_NEXT() aclk_get_conv_log_next()
108
-#endif
103
#endif
104
105
unsigned long int aclk_tbeb_delay(int reset, int base, unsigned long int min, unsigned long int max);
build/m4/ax_c___atomic.m4
deleted
-36
@@ -1,36 +0,0 @@
1
-# AC_C___ATOMIC
2
-# -------------
3
-# Define HAVE_C___ATOMIC if __atomic works.
4
-AN_IDENTIFIER([__atomic], [AC_C___ATOMIC])
5
-AC_DEFUN([AC_C___ATOMIC],
6
-[AC_CACHE_CHECK([for __atomic], ac_cv_c___atomic,
7
-[AC_LINK_IFELSE(
8
- [AC_LANG_SOURCE(
9
- [[int
10
- main (int argc, char **argv)
11
- {
12
- volatile unsigned long ul1 = 1, ul2 = 0, ul3 = 2;
13
- __atomic_load_n(&ul1, __ATOMIC_SEQ_CST);
14
- __atomic_compare_exchange(&ul1, &ul2, &ul3, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
15
- __atomic_fetch_add(&ul1, 1, __ATOMIC_SEQ_CST);
16
- __atomic_fetch_sub(&ul3, 1, __ATOMIC_SEQ_CST);
17
- __atomic_or_fetch(&ul1, ul2, __ATOMIC_SEQ_CST);
18
- __atomic_and_fetch(&ul1, ul2, __ATOMIC_SEQ_CST);
19
- volatile unsigned long long ull1 = 1, ull2 = 0, ull3 = 2;
20
- __atomic_load_n(&ull1, __ATOMIC_SEQ_CST);
21
- __atomic_compare_exchange(&ull1, &ull2, &ull3, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
22
- __atomic_fetch_add(&ull1, 1, __ATOMIC_SEQ_CST);
23
- __atomic_fetch_sub(&ull3, 1, __ATOMIC_SEQ_CST);
24
- __atomic_or_fetch(&ull1, ull2, __ATOMIC_SEQ_CST);
25
- __atomic_and_fetch(&ull1, ull2, __ATOMIC_SEQ_CST);
26
- return 0;
27
- }
28
- ]])],
29
- [ac_cv_c___atomic=yes],
30
- [ac_cv_c___atomic=no])])
31
-if test $ac_cv_c___atomic = yes; then
32
- AC_DEFINE([HAVE_C___ATOMIC], 1,
33
- [Define to 1 if __atomic operations work.])
34
-fi
35
-])# AC_C___ATOMIC
36
-
configure.ac
-11
@@ -260,7 +260,6 @@ AC_TYPE_UINT64_T
260
AC_C_INLINE
261
AC_FUNC_STRERROR_R
262
AC_C__GENERIC
263
-AC_C___ATOMIC
263
# AC_C_STMT_EXPR
264
AC_CANONICAL_HOST
265
AC_HEADER_MAJOR
@@ -1546,14 +1545,6 @@ AC_MSG_RESULT([${enable_lto}])
1545
1546
# -----------------------------------------------------------------------------
1547
1549
-if test "${enable_exporting_kinesis}" = "yes" -o \
1550
- "${enable_exporting_pubsub}" = "yes" -o \
1551
- "${enable_exporting_prometheus_remote_write}" = "yes" -o \
1552
- "${new_cloud_protocol}" = "yes" -o \
1553
- "${build_ml}" = "yes"; then
1554
- enable_cxx_linker="yes"
1555
-fi
1556
-
1548
# Try to unconditionally link with -latomic. If the compiler can satisfy
1549
# all the atomic ops with builtins then, the library will be left unused.
1550
# Otherwise, some ops will be covered by the compiler's intrinsics and some
@@ -1583,8 +1574,6 @@ AC_SUBST([OPTIONAL_ATOMIC_LIBS])
1574
1575
AC_LANG_POP([C++])
1576
1586
-AM_CONDITIONAL([ENABLE_CXX_LINKER], [test "${enable_cxx_linker}" = "yes"])
1587
-
1577
AC_DEFINE_UNQUOTED([NETDATA_USER], ["${with_user}"], [use this user to drop privileged])
1578
1579
varlibdir="${localstatedir}/lib/netdata"
daemon/global_statistics.c
+1
-81
@@ -37,37 +37,10 @@ static struct global_statistics {
37
.rrdr_result_points_generated = 0,
38
};
39
40
-#if defined(HAVE_C___ATOMIC)
41
-#else
42
-netdata_mutex_t global_statistics_mutex = NETDATA_MUTEX_INITIALIZER;
43
-
44
-static inline void global_statistics_lock(void) {
45
- netdata_mutex_lock(&global_statistics_mutex);
46
-}
47
-
48
-static inline void global_statistics_unlock(void) {
49
- netdata_mutex_unlock(&global_statistics_mutex);
50
-}
51
-#endif
52
-
53
-
40
void rrdr_query_completed(uint64_t db_points_read, uint64_t result_points_generated) {
55
-#if defined(HAVE_C___ATOMIC)
41
__atomic_fetch_add(&global_statistics.rrdr_queries_made, 1, __ATOMIC_SEQ_CST);
42
__atomic_fetch_add(&global_statistics.rrdr_db_points_read, db_points_read, __ATOMIC_SEQ_CST);
43
__atomic_fetch_add(&global_statistics.rrdr_result_points_generated, result_points_generated, __ATOMIC_SEQ_CST);
59
-#else
60
- #warning NOT using atomic operations - using locks for global statistics
61
- if (web_server_is_multithreaded)
62
- global_statistics_lock();
63
-
64
- global_statistics.rrdr_queries_made++;
65
- global_statistics.rrdr_db_points_read += db_points_read;
66
- global_statistics.rrdr_result_points_generated += result_points_generated;
67
-
68
- if (web_server_is_multithreaded)
69
- global_statistics_unlock();
70
-#endif
44
}
45
46
void finished_web_request_statistics(uint64_t dt,
@@ -75,7 +48,6 @@ void finished_web_request_statistics(uint64_t dt,
48
uint64_t bytes_sent,
49
uint64_t content_size,
50
uint64_t compressed_content_size) {
78
-#if defined(HAVE_C___ATOMIC)
51
uint64_t old_web_usec_max = global_statistics.web_usec_max;
52
while(dt > old_web_usec_max)
53
__atomic_compare_exchange(&global_statistics.web_usec_max, &old_web_usec_max, &dt, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
@@ -86,61 +58,19 @@ void finished_web_request_statistics(uint64_t dt,
58
__atomic_fetch_add(&global_statistics.bytes_sent, bytes_sent, __ATOMIC_SEQ_CST);
59
__atomic_fetch_add(&global_statistics.content_size, content_size, __ATOMIC_SEQ_CST);
60
__atomic_fetch_add(&global_statistics.compressed_content_size, compressed_content_size, __ATOMIC_SEQ_CST);
89
-#else
90
-#warning NOT using atomic operations - using locks for global statistics
91
- if (web_server_is_multithreaded)
92
- global_statistics_lock();
93
-
94
- if (dt > global_statistics.web_usec_max)
95
- global_statistics.web_usec_max = dt;
96
-
97
- global_statistics.web_requests++;
98
- global_statistics.web_usec += dt;
99
- global_statistics.bytes_received += bytes_received;
100
- global_statistics.bytes_sent += bytes_sent;
101
- global_statistics.content_size += content_size;
102
- global_statistics.compressed_content_size += compressed_content_size;
103
-
104
- if (web_server_is_multithreaded)
105
- global_statistics_unlock();
106
-#endif
61
}
62
63
uint64_t web_client_connected(void) {
110
-#if defined(HAVE_C___ATOMIC)
64
__atomic_fetch_add(&global_statistics.connected_clients, 1, __ATOMIC_SEQ_CST);
112
- uint64_t id = __atomic_fetch_add(&global_statistics.web_client_count, 1, __ATOMIC_SEQ_CST);
113
-#else
114
- if (web_server_is_multithreaded)
115
- global_statistics_lock();
116
-
117
- global_statistics.connected_clients++;
118
- uint64_t id = global_statistics.web_client_count++;
119
-
120
- if (web_server_is_multithreaded)
121
- global_statistics_unlock();
122
-#endif
123
-
124
- return id;
65
+ return __atomic_fetch_add(&global_statistics.web_client_count, 1, __ATOMIC_SEQ_CST);
66
}
67
68
void web_client_disconnected(void) {
128
-#if defined(HAVE_C___ATOMIC)
69
__atomic_fetch_sub(&global_statistics.connected_clients, 1, __ATOMIC_SEQ_CST);
130
-#else
131
- if (web_server_is_multithreaded)
132
- global_statistics_lock();
133
-
134
- global_statistics.connected_clients--;
135
-
136
- if (web_server_is_multithreaded)
137
- global_statistics_unlock();
138
-#endif
70
}
71
72
73
static inline void global_statistics_copy(struct global_statistics *gs, uint8_t options) {
143
-#if defined(HAVE_C___ATOMIC)
74
gs->connected_clients = __atomic_fetch_add(&global_statistics.connected_clients, 0, __ATOMIC_SEQ_CST);
75
gs->web_requests = __atomic_fetch_add(&global_statistics.web_requests, 0, __ATOMIC_SEQ_CST);
76
gs->web_usec = __atomic_fetch_add(&global_statistics.web_usec, 0, __ATOMIC_SEQ_CST);
@@ -160,16 +90,6 @@ static inline void global_statistics_copy(struct global_statistics *gs, uint8_t
90
__atomic_compare_exchange(&global_statistics.web_usec_max, (uint64_t *) &gs->web_usec_max, &n, 1, __ATOMIC_SEQ_CST,
91
__ATOMIC_SEQ_CST);
92
}
163
-#else
164
- global_statistics_lock();
165
-
166
- memcpy(gs, (const void *)&global_statistics, sizeof(struct global_statistics));
167
-
168
- if (options & GLOBAL_STATS_RESET_WEB_USEC_MAX)
169
- global_statistics.web_usec_max = 0;
170
-
171
- global_statistics_unlock();
172
-#endif
93
}
94
95
static void global_statistics_charts(void) {
database/rrd.h
-19
@@ -172,15 +172,9 @@ typedef enum rrddim_flags {
172
RRDDIM_FLAG_PENDING_FOREACH_ALARM = (1 << 5), // set when foreach alarm has not been initialized yet
173
} RRDDIM_FLAGS;
174
175
-#ifdef HAVE_C___ATOMIC
175
#define rrddim_flag_check(rd, flag) (__atomic_load_n(&((rd)->flags), __ATOMIC_SEQ_CST) & (flag))
176
#define rrddim_flag_set(rd, flag) __atomic_or_fetch(&((rd)->flags), (flag), __ATOMIC_SEQ_CST)
177
#define rrddim_flag_clear(rd, flag) __atomic_and_fetch(&((rd)->flags), ~(flag), __ATOMIC_SEQ_CST)
179
-#else
180
-#define rrddim_flag_check(rd, flag) ((rd)->flags & (flag))
181
-#define rrddim_flag_set(rd, flag) (rd)->flags |= (flag)
182
-#define rrddim_flag_clear(rd, flag) (rd)->flags &= ~(flag)
183
-#endif
178
179
typedef enum label_source {
180
LABEL_SOURCE_AUTO = 0,
@@ -483,16 +477,9 @@ typedef enum rrdset_flags {
477
RRDSET_FLAG_ANOMALY_DETECTION = 1 << 18 // flag to identify anomaly detection charts.
478
} RRDSET_FLAGS;
479
486
-#ifdef HAVE_C___ATOMIC
480
#define rrdset_flag_check(st, flag) (__atomic_load_n(&((st)->flags), __ATOMIC_SEQ_CST) & (flag))
481
#define rrdset_flag_set(st, flag) __atomic_or_fetch(&((st)->flags), flag, __ATOMIC_SEQ_CST)
482
#define rrdset_flag_clear(st, flag) __atomic_and_fetch(&((st)->flags), ~flag, __ATOMIC_SEQ_CST)
490
-#else
491
-#define rrdset_flag_check(st, flag) ((st)->flags & (flag))
492
-#define rrdset_flag_set(st, flag) (st)->flags |= (flag)
493
-#define rrdset_flag_clear(st, flag) (st)->flags &= ~(flag)
494
-#endif
495
-#define rrdset_flag_check_noatomic(st, flag) ((st)->flags & (flag))
483
484
struct rrdset {
485
// ------------------------------------------------------------------------
@@ -642,15 +629,9 @@ typedef enum rrdhost_flags {
629
RRDHOST_FLAG_PENDING_FOREACH_ALARMS = 1 << 7, // contains dims with uninitialized foreach alarms
630
} RRDHOST_FLAGS;
631
645
-#ifdef HAVE_C___ATOMIC
632
#define rrdhost_flag_check(host, flag) (__atomic_load_n(&((host)->flags), __ATOMIC_SEQ_CST) & (flag))
633
#define rrdhost_flag_set(host, flag) __atomic_or_fetch(&((host)->flags), flag, __ATOMIC_SEQ_CST)
634
#define rrdhost_flag_clear(host, flag) __atomic_and_fetch(&((host)->flags), ~flag, __ATOMIC_SEQ_CST)
649
-#else
650
-#define rrdhost_flag_check(host, flag) ((host)->flags & (flag))
651
-#define rrdhost_flag_set(host, flag) (host)->flags |= (flag)
652
-#define rrdhost_flag_clear(host, flag) (host)->flags &= ~(flag)
653
-#endif
635
636
#ifdef NETDATA_INTERNAL_CHECKS
637
#define rrdset_debug(st, fmt, args...) do { if(unlikely(debug_flags & D_RRD_STATS && rrdset_flag_check(st, RRDSET_FLAG_DEBUG))) \
database/rrdset.c
+2
-2
@@ -953,7 +953,7 @@ RRDSET *rrdset_create_custom(
953
// RRDSET - data collection iteration control
954
955
inline void rrdset_next_usec_unfiltered(RRDSET *st, usec_t microseconds) {
956
- if(unlikely(!st->last_collected_time.tv_sec || !microseconds || (rrdset_flag_check_noatomic(st, RRDSET_FLAG_SYNC_CLOCK)))) {
956
+ if(unlikely(!st->last_collected_time.tv_sec || !microseconds || (rrdset_flag_check(st, RRDSET_FLAG_SYNC_CLOCK)))) {
957
// call the full next_usec() function
958
rrdset_next_usec(st, microseconds);
959
return;
@@ -971,7 +971,7 @@ inline void rrdset_next_usec(RRDSET *st, usec_t microseconds) {
971
usec_t discarded = microseconds;
972
#endif
973
974
- if(unlikely(rrdset_flag_check_noatomic(st, RRDSET_FLAG_SYNC_CLOCK))) {
974
+ if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_SYNC_CLOCK))) {
975
// the chart needs to be re-synced to current time
976
rrdset_flag_clear(st, RRDSET_FLAG_SYNC_CLOCK);
977
web/server/web_client.h
-6
@@ -68,15 +68,9 @@ typedef enum web_client_flags {
68
WEB_CLIENT_CHUNKED_TRANSFER = 1 << 10, // chunked transfer (used with zlib compression)
69
} WEB_CLIENT_FLAGS;
70
71
-//#ifdef HAVE_C___ATOMIC
72
-//#define web_client_flag_check(w, flag) (__atomic_load_n(&((w)->flags), __ATOMIC_SEQ_CST) & flag)
73
-//#define web_client_flag_set(w, flag) __atomic_or_fetch(&((w)->flags), flag, __ATOMIC_SEQ_CST)
74
-//#define web_client_flag_clear(w, flag) __atomic_and_fetch(&((w)->flags), ~flag, __ATOMIC_SEQ_CST)
75
-//#else
71
#define web_client_flag_check(w, flag) ((w)->flags & (flag))
72
#define web_client_flag_set(w, flag) (w)->flags |= flag
73
#define web_client_flag_clear(w, flag) (w)->flags &= ~flag
79
-//#endif
74
75
#define WEB_CLIENT_IS_DEAD(w) web_client_flag_set(w, WEB_CLIENT_FLAG_DEAD)
76
#define web_client_check_dead(w) web_client_flag_check(w, WEB_CLIENT_FLAG_DEAD)