summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-01-11 11:31:52 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-01-11 11:39:12 +0900
commitd2aaf865e3e5ecfcd10c879ce4263dc3a8f7fccf (patch)
tree463daa9aa367a598e704dc21002706acb3a242c5 /ext
parentf6e2c41db30cc3d46053de70dbfe87a5db24d58d (diff)
[ruby/etc] Added fallback definition of RUBY_ATOMIC_EXCHANGE
https://github.com/ruby/etc/commit/0c5900bd21
Diffstat (limited to 'ext')
-rw-r--r--ext/etc/etc.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/ext/etc/etc.c b/ext/etc/etc.c
index 44273ff9ad..50f566d10f 100644
--- a/ext/etc/etc.c
+++ b/ext/etc/etc.c
@@ -68,6 +68,15 @@ void rb_deprecate_constant(VALUE mod, const char *name);
typedef int rb_atomic_t;
# define RUBY_ATOMIC_CAS(var, oldval, newval) \
((var) == (oldval) ? ((var) = (newval), (oldval)) : (var))
+# define RUBY_ATOMIC_EXCHANGE(var, newval) \
+ atomic_exchange(&var, newval)
+static inline rb_atomic_t
+atomic_exchange(volatile rb_atomic_t *var, rb_atomic_t newval)
+{
+ rb_atomic_t oldval = *var;
+ *var = newval;
+ return oldval;
+}
#endif
/* call-seq: