Browse Source

Use atomic ops if possible

pull/444/head
Vsevolod Stakhov 11 years ago
parent
commit
86c5962983
  1. 11
      CMakeLists.txt
  2. 1
      config.h.in
  3. 5
      src/controller.c
  4. 10
      src/fuzzy_storage.c
  5. 11
      src/libserver/protocol.c
  6. 4
      src/libutil/ref.h

11
CMakeLists.txt

@ -923,15 +923,22 @@ CHECK_C_SOURCE_COMPILES ("#include <sys/types.h>
ENDIF(NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS") ENDIF(NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS")
CHECK_C_SOURCE_RUNS(" CHECK_C_SOURCE_RUNS("
#include <stdbool.h>
int main(int argc, char **argv) { 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 0;
} }
return -1; return -1;
} }
" HAVE_ATOMIC_BUILTINS) " 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 # Check queue.h compatibility
IF(NOT HAVE_COMPATIBLE_QUEUE_H) IF(NOT HAVE_COMPATIBLE_QUEUE_H)
INCLUDE_DIRECTORIES(compat) INCLUDE_DIRECTORIES(compat)

1
config.h.in

@ -226,6 +226,7 @@
#cmakedefine HAVE_SETSIG 1 #cmakedefine HAVE_SETSIG 1
#cmakedefine HAVE_OASYNC 1 #cmakedefine HAVE_OASYNC 1
#cmakedefine WITH_SNOWBALL 1 #cmakedefine WITH_SNOWBALL 1
#cmakedefine HAVE_ATOMIC_BUILTINS 1
/* Configure allocator */ /* Configure allocator */
#define uthash_malloc(sz) g_slice_alloc(sz) #define uthash_malloc(sz) g_slice_alloc(sz)

5
src/controller.c

@ -1831,7 +1831,12 @@ rspamd_controller_handle_stat_common (
ham += stat->actions_stat[i]; ham += stat->actions_stat[i];
} }
if (do_reset) { if (do_reset) {
#ifndef HAVE_ATOMIC_BUILTINS
session->ctx->worker->srv->stat->actions_stat[i] = 0; 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); ucl_object_insert_key (top, sub, "actions", 0, false);

10
src/fuzzy_storage.c

@ -288,11 +288,21 @@ rspamd_fuzzy_process_command (struct fuzzy_session *session)
result = rspamd_fuzzy_backend_check (session->ctx->backend, cmd, result = rspamd_fuzzy_backend_check (session->ctx->backend, cmd,
session->ctx->expire); session->ctx->expire);
/* XXX: actually, these updates are not atomic, but we don't care */ /* XXX: actually, these updates are not atomic, but we don't care */
#ifndef HAVE_ATOMIC_BUILTINS
server_stat->fuzzy_hashes_checked[session->epoch] ++; server_stat->fuzzy_hashes_checked[session->epoch] ++;
if (result.prob > 0.5) { if (result.prob > 0.5) {
server_stat->fuzzy_hashes_found[session->epoch] ++; 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 { else {
result.flag = cmd->flag; result.flag = cmd->flag;

11
src/libserver/protocol.c

@ -1035,13 +1035,22 @@ rspamd_protocol_http_reply (struct rspamd_http_message *msg,
action = rspamd_check_action_metric (task, metric_res->score, &required_score, action = rspamd_check_action_metric (task, metric_res->score, &required_score,
metric_res->metric); metric_res->metric);
if (action <= METRIC_ACTION_NOACTION) { if (action <= METRIC_ACTION_NOACTION) {
#ifndef HAVE_ATOMIC_BUILTINS
task->worker->srv->stat->actions_stat[action]++; task->worker->srv->stat->actions_stat[action]++;
#else
__atomic_add_fetch (&task->worker->srv->stat->actions_stat[action],
1, __ATOMIC_RELEASE);
#endif
} }
} }
/* Increase counters */ /* Increase counters */
#ifndef HAVE_ATOMIC_BUILTINS
task->worker->srv->stat->messages_scanned++; task->worker->srv->stat->messages_scanned++;
#else
__atomic_add_fetch (&task->worker->srv->stat->messages_scanned,
1, __ATOMIC_RELEASE);
#endif
} }
} }

4
src/libutil/ref.h

@ -55,13 +55,13 @@ typedef struct ref_entry_s {
#ifdef HAVE_ATOMIC_BUILTINS #ifdef HAVE_ATOMIC_BUILTINS
#define REF_RETAIN(obj) do { \ #define REF_RETAIN(obj) do { \
if ((obj) != NULL) { \ if ((obj) != NULL) { \
__sync_add_and_fetch (&(obj)->ref.refcount, 1); \
__atomic_add_fetch (&(obj)->ref.refcount, 1, __ATOMIC_RELEASE); \
} \ } \
} while (0) } while (0)
#define REF_RELEASE(obj) do { \ #define REF_RELEASE(obj) do { \
if ((obj) != NULL) { \ 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) { \ if (_rc_priv == 0 && (obj)->ref.dtor) { \
(obj)->ref.dtor (obj); \ (obj)->ref.dtor (obj); \
} \ } \

Loading…
Cancel
Save