]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Use atomic ops if possible
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 26 Nov 2015 18:50:03 +0000 (18:50 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 26 Nov 2015 18:50:03 +0000 (18:50 +0000)
CMakeLists.txt
config.h.in
src/controller.c
src/fuzzy_storage.c
src/libserver/protocol.c
src/libutil/ref.h

index 01d7d940bf8efd5c9676f2a6dfa4abb909722388..6c702e76d6cd2a2660383f9e795a2c55eb4fb4ea 100644 (file)
@@ -923,15 +923,22 @@ CHECK_C_SOURCE_COMPILES ("#include <sys/types.h>
 ENDIF(NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS")
 
 CHECK_C_SOURCE_RUNS("
+#include <stdbool.h>
 int main(int argc, char **argv) {
-        int a = 0;
-        if (__sync_bool_compare_and_swap(&a, 0, 1)) {
+        int a = 0, b = 0;
+        if (__atomic_compare_exchange_n(&a, &b, 1, false, __ATOMIC_RELEASE, __ATOMIC_RELAXED)) {
                 return 0;
         }
         return -1;
 }
 " HAVE_ATOMIC_BUILTINS)
 
+IF(NOT HAVE_ATOMIC_BUILTINS)
+       MESSAGE(STATUS "atomic builtins are -NOT- supported")
+ELSE()
+       MESSAGE(STATUS "atomic builtins are supported")
+ENDIF()
+
 # Check queue.h compatibility
 IF(NOT HAVE_COMPATIBLE_QUEUE_H)
        INCLUDE_DIRECTORIES(compat)
index 3ecb964bed7bacf9da192c34b550fe4cfeb6cc8d..001506a6a0aeb5f01da626490dde81547aae3f1a 100644 (file)
 #cmakedefine HAVE_SETSIG         1
 #cmakedefine HAVE_OASYNC         1
 #cmakedefine WITH_SNOWBALL       1
+#cmakedefine HAVE_ATOMIC_BUILTINS 1
 
 /* Configure allocator */
 #define uthash_malloc(sz) g_slice_alloc(sz)
index bb494108f385af404fd3f19982a05ee21ab77e16..d04aba5c760233bb7f44b83cd1d793d3f1e16e5c 100644 (file)
@@ -1831,7 +1831,12 @@ rspamd_controller_handle_stat_common (
                                ham += stat->actions_stat[i];
                        }
                        if (do_reset) {
+#ifndef HAVE_ATOMIC_BUILTINS
                                session->ctx->worker->srv->stat->actions_stat[i] = 0;
+#else
+                               __atomic_store_n(&session->ctx->worker->srv->stat->actions_stat[i],
+                                               0, __ATOMIC_RELEASE);
+#endif
                        }
                }
                ucl_object_insert_key (top, sub, "actions", 0, false);
index f3be2ab68298595c3c8f4959153b5802ac33cacf..bde583387c49767d382124c65ae5a6defe9d9d43 100644 (file)
@@ -288,11 +288,21 @@ rspamd_fuzzy_process_command (struct fuzzy_session *session)
                result = rspamd_fuzzy_backend_check (session->ctx->backend, cmd,
                                session->ctx->expire);
                /* XXX: actually, these updates are not atomic, but we don't care */
+#ifndef HAVE_ATOMIC_BUILTINS
                server_stat->fuzzy_hashes_checked[session->epoch] ++;
 
                if (result.prob > 0.5) {
                        server_stat->fuzzy_hashes_found[session->epoch] ++;
                }
+#else
+               __atomic_add_fetch (&server_stat->fuzzy_hashes_checked[session->epoch],
+                               1, __ATOMIC_RELEASE);
+
+               if (result.prob > 0.5) {
+                       __atomic_add_fetch (&server_stat->fuzzy_hashes_found[session->epoch],
+                                       1, __ATOMIC_RELEASE);
+               }
+#endif
        }
        else {
                result.flag = cmd->flag;
index d20c50ff8381a90b415dac86f50fdc30b5e1c9c5..5cd3589f68f3d3c8550f54e2944e655b415282b6 100644 (file)
@@ -1035,13 +1035,22 @@ rspamd_protocol_http_reply (struct rspamd_http_message *msg,
                        action = rspamd_check_action_metric (task, metric_res->score, &required_score,
                                        metric_res->metric);
                        if (action <= METRIC_ACTION_NOACTION) {
+#ifndef HAVE_ATOMIC_BUILTINS
                                task->worker->srv->stat->actions_stat[action]++;
+#else
+                               __atomic_add_fetch (&task->worker->srv->stat->actions_stat[action],
+                                               1, __ATOMIC_RELEASE);
+#endif
                        }
                }
 
                /* Increase counters */
-
+#ifndef HAVE_ATOMIC_BUILTINS
                task->worker->srv->stat->messages_scanned++;
+#else
+               __atomic_add_fetch (&task->worker->srv->stat->messages_scanned,
+                               1, __ATOMIC_RELEASE);
+#endif
        }
 }
 
index 18e2c390316e10bb3483d1149a9c8e7bf7ae1d9a..1ad7d24a1ad7d2b10f4ffb354f6340093d3cfe2d 100644 (file)
@@ -55,13 +55,13 @@ typedef struct ref_entry_s {
 #ifdef HAVE_ATOMIC_BUILTINS
 #define REF_RETAIN(obj) do {                                                                           \
        if ((obj) != NULL) {                                                                                    \
-    __sync_add_and_fetch (&(obj)->ref.refcount, 1);                                    \
+    __atomic_add_fetch (&(obj)->ref.refcount, 1, __ATOMIC_RELEASE);    \
        }                                                                                                                               \
 } while (0)
 
 #define REF_RELEASE(obj) do {                                                                          \
        if ((obj) != NULL) {                                                                                    \
-       unsigned int _rc_priv = __sync_sub_and_fetch (&(obj)->ref.refcount, 1); \
+       unsigned int _rc_priv = __atomic_sub_fetch (&(obj)->ref.refcount, 1, __ATOMIC_ACQ_REL); \
        if (_rc_priv == 0 && (obj)->ref.dtor) {                                                         \
                (obj)->ref.dtor (obj);                                                                          \
        }                                                                                                                               \