summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--atomic.h5
-rw-r--r--signal.c2
3 files changed, 12 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index fac404b94e..41c0086c5c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Fri Oct 14 05:58:05 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * atomic.h (ATOMIC_INC, ATOMIC_DEC): return old values.
+ [ruby-dev:44596] [Bug #5439]
+
+ * signal.c (ruby_atomic_exchange): no needs to define on the
+ platforms where atomic.h is available.
+
Thu Oct 13 19:29:40 2011 Naohisa Goto <ngotogenome@gmail.com>
* atomic.h (ATOMIC_*): use atomic_ops(3C) when SunStudio on Solaris.
diff --git a/atomic.h b/atomic.h
index d131677aa6..33f731927d 100644
--- a/atomic.h
+++ b/atomic.h
@@ -54,11 +54,12 @@ typedef unsigned int rb_atomic_t;
#else
typedef int rb_atomic_t;
+#define NEED_RUBY_ATOMIC_EXCHANGE
extern rb_atomic_t ruby_atomic_exchange(rb_atomic_t *ptr, rb_atomic_t val);
# define ATOMIC_SET(var, val) (void)((var) = (val))
-# define ATOMIC_INC(var) (++(var))
-# define ATOMIC_DEC(var) (--(var))
+# define ATOMIC_INC(var) ((var)++)
+# define ATOMIC_DEC(var) ((var)--)
# define ATOMIC_OR(var, val) ((var) |= (val))
# define ATOMIC_EXCHANGE(var, val) ruby_atomic_exchange(&(var), (val))
#endif
diff --git a/signal.c b/signal.c
index 02ec9d3ebc..9b4e15eec0 100644
--- a/signal.c
+++ b/signal.c
@@ -18,7 +18,7 @@
#include <errno.h>
#include "atomic.h"
-#if !defined(_WIN32) && !defined(HAVE_GCC_ATOMIC_BUILTINS)
+#ifdef NEED_RUBY_ATOMIC_EXCHANGE
rb_atomic_t
ruby_atomic_exchange(rb_atomic_t *ptr, rb_atomic_t val)
{