aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-11-23 09:10:12 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-11-23 09:10:12 +0000
commit0677cd445197fa1ea202b276561b735c903f8c50 (patch)
tree52a508dc11c38f7120a1da16965d97352b4a282d
parent70e79ce3e6885074a22d1526d9a2bfbbb6e5a5ea (diff)
downloadrspamd-0677cd445197fa1ea202b276561b735c903f8c50.tar.gz
rspamd-0677cd445197fa1ea202b276561b735c903f8c50.zip
Test for atomic ops.
-rw-r--r--CMakeLists.txt12
-rw-r--r--src/libutil/ref.h3
-rw-r--r--src/libutil/upstream.c2
3 files changed, 17 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c5e762567..01d7d940b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -146,6 +146,7 @@ INCLUDE(CheckIncludeFiles)
INCLUDE(CheckFunctionExists)
INCLUDE(CheckSymbolExists)
INCLUDE(CheckCSourceCompiles)
+INCLUDE(CheckCSourceRuns)
INCLUDE(CheckLibraryExists)
INCLUDE(CheckCCompilerFlag)
INCLUDE(CMakeParseArguments)
@@ -921,6 +922,16 @@ CHECK_C_SOURCE_COMPILES ("#include <sys/types.h>
}" HAVE_ASM_PAUSE)
ENDIF(NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS")
+CHECK_C_SOURCE_RUNS("
+int main(int argc, char **argv) {
+ int a = 0;
+ if (__sync_bool_compare_and_swap(&a, 0, 1)) {
+ return 0;
+ }
+ return -1;
+}
+" HAVE_ATOMIC_BUILTINS)
+
# Check queue.h compatibility
IF(NOT HAVE_COMPATIBLE_QUEUE_H)
INCLUDE_DIRECTORIES(compat)
@@ -1038,6 +1049,7 @@ ADD_SUBDIRECTORY(utils)
CONFIGURE_FILE(config.h.in src/config.h)
+ADD_DEFINITIONS("HAVE_CONFIG_H")
##################### INSTALLATION ##########################################
diff --git a/src/libutil/ref.h b/src/libutil/ref.h
index 8caab5c8f..18e2c3903 100644
--- a/src/libutil/ref.h
+++ b/src/libutil/ref.h
@@ -23,6 +23,9 @@
#ifndef REF_H_
#define REF_H_
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
/**
* @file ref.h
* A set of macros to handle refcounts
diff --git a/src/libutil/upstream.c b/src/libutil/upstream.c
index 63680444e..5b843451f 100644
--- a/src/libutil/upstream.c
+++ b/src/libutil/upstream.c
@@ -802,6 +802,7 @@ rspamd_upstream_reresolve (struct upstream_ctx *ctx)
while (cur) {
up = cur->data;
+ REF_RETAIN (up);
if (up->name[0] != '/') {
if (rdns_make_request_full (ctx->res,
@@ -829,6 +830,7 @@ rspamd_upstream_reresolve (struct upstream_ctx *ctx)
}
}
+ REF_RELEASE (up);
cur = g_list_next (cur);
}
}