@cryptotaxi247 / netdata-1 / commits / b6d2a3662

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)