summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--runtime/atomic.h27
-rw-r--r--runtime/statsobj.h8
3 files changed, 35 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index e18c152e..d0661256 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,8 @@
---------------------------------------------------------------------------
+Version 5.7.3 [V5-DEVEL] (rgerhards), 2010-12-??
+- bugfix: fixed build problems on some platforms
+ namely those that have 32bit atomic operations but not 64 bit ones
+---------------------------------------------------------------------------
Version 5.7.2 [V5-DEVEL] (rgerhards), 2010-11-26
- bugfix(important): problem in TLS handling could cause rsyslog to loop
in a tight loop, effectively disabling functionality and bearing the
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