summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2010-12-01 18:13:40 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2010-12-01 18:13:40 +0100
commitf8769ca19da2eff26dd80ca3b6217d078db1a59f (patch)
tree5f2151270e351c541d696e858ff94ba39c39528f /runtime
parent1aac36dfd077073a76b80368f893810e1741a1ec (diff)
downloadrsyslog-f8769ca19da2eff26dd80ca3b6217d078db1a59f.tar.gz
rsyslog-f8769ca19da2eff26dd80ca3b6217d078db1a59f.tar.xz
rsyslog-f8769ca19da2eff26dd80ca3b6217d078db1a59f.zip
bugfix: fixed build problems on some platforms
namely those that have 32bit atomic operations but not 64 bit ones
Diffstat (limited to 'runtime')
-rw-r--r--runtime/atomic.h27
-rw-r--r--runtime/statsobj.h8
2 files changed, 31 insertions, 4 deletions
diff --git a/runtime/atomic.h b/runtime/atomic.h
index 790cb1c6..c022035c 100644
--- a/runtime/atomic.h
+++ b/runtime/atomic.h
@@ -208,4 +208,31 @@
#endif
+/* we need to handle 64bit atomics seperately as some platforms have
+ * 32 bit atomics, but not 64 biot ones... -- rgerhards, 2010-12-01
+ */
+#ifdef HAVE_ATOMIC_BUILTINS_64BIT
+# define ATOMIC_INC_uint64(data, phlpmut) ((void) __sync_fetch_and_add(data, 1))
+# define ATOMIC_DEC_unit64(data, phlpmut) ((void) __sync_sub_and_fetch(data, 1))
+
+# define DEF_ATOMIC_HELPER_MUT64(x)
+# define INIT_ATOMIC_HELPER_MUT64(x)
+# define DESTROY_ATOMIC_HELPER_MUT64(x)
+#else
+# define ATOMIC_INC_uint64(data, phlpmut) { \
+ pthread_mutex_lock(phlpmut); \
+ ++(*(data)); \
+ pthread_mutex_unlock(phlpmut); \
+ }
+# define ATOMIC_DEC_uint64(data, phlpmut) { \
+ pthread_mutex_lock(phlpmut); \
+ --(*(data)); \
+ pthread_mutex_unlock(phlpmut); \
+ }
+
+# define DEF_ATOMIC_HELPER_MUT64(x) pthread_mutex_t x
+# define INIT_ATOMIC_HELPER_MUT64(x) pthread_mutex_init(&(x), NULL)
+# define DESTROY_ATOMIC_HELPER_MUT64(x) pthread_mutex_destroy(&(x))
+#endif /* #ifdef HAVE_ATOMIC_BUILTINS_64BIT */
+
#endif /* #ifndef INCLUDED_ATOMIC_H */
diff --git a/runtime/statsobj.h b/runtime/statsobj.h
index 7447cded..44c26bea 100644
--- a/runtime/statsobj.h
+++ b/runtime/statsobj.h
@@ -99,19 +99,19 @@ PROTOTYPEObj(statsobj);
*/
#define STATSCOUNTER_DEF(ctr, mut) \
intctr_t ctr; \
- DEF_ATOMIC_HELPER_MUT(mut);
+ DEF_ATOMIC_HELPER_MUT64(mut);
#define STATSCOUNTER_INIT(ctr, mut) \
- INIT_ATOMIC_HELPER_MUT(mut); \
+ INIT_ATOMIC_HELPER_MUT64(mut); \
ctr = 0;
#define STATSCOUNTER_INC(ctr, mut) \
if(GatherStats) \
- ATOMIC_INC(&ctr, &mut);
+ ATOMIC_INC_uint64(&ctr, &mut);
#define STATSCOUNTER_DEC(ctr, mut) \
if(GatherStats) \
- ATOMIC_DEC(&ctr, mut);
+ ATOMIC_DEC_uint64(&ctr, mut);
/* the next macro works only if the variable is already guarded
* by mutex (or the users risks a wrong result). It is assumed