aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mjit.c10
-rw-r--r--ruby_atomic.h4
2 files changed, 5 insertions, 9 deletions
diff --git a/mjit.c b/mjit.c
index fe1d21af67..58fe0cb1d1 100644
--- a/mjit.c
+++ b/mjit.c
@@ -140,15 +140,7 @@ typedef intptr_t pid_t;
#endif
/* Atomically set function pointer if possible. */
-#ifdef _WIN32
-# ifdef InterlockedExchangePointer
-# define MJIT_ATOMIC_SET(var, val) InterlockedExchangePointer((void **)&(var), (void *)val)
-# else
-# define MJIT_ATOMIC_SET(var, val) (void)((var) = (val))
-# endif
-#else
-# define MJIT_ATOMIC_SET(var, val) ATOMIC_SET(var, val)
-#endif
+#define MJIT_ATOMIC_SET(var, val) ATOMIC_PTR_EXCHANGE(var, val)
/* A copy of MJIT portion of MRI options since MJIT initialization. We
need them as MJIT threads still can work when the most MRI data were
diff --git a/ruby_atomic.h b/ruby_atomic.h
index ba25758a28..1b395cd23f 100644
--- a/ruby_atomic.h
+++ b/ruby_atomic.h
@@ -90,6 +90,10 @@ rb_w32_atomic_cas(volatile rb_atomic_t *var, rb_atomic_t oldval, rb_atomic_t new
# define ATOMIC_SIZE_EXCHANGE(var, val) InterlockedExchange((LONG *)&(var), (val))
# endif
+# ifdef InterlockedExchangePointer
+# define ATOMIC_PTR_EXCHANGE(var, val) InterlockedExchangePointer((PVOID volatile *)&(var), (PVOID)(val))
+# endif /* See below for definitions of other situations */
+
#elif defined(__sun) && defined(HAVE_ATOMIC_H)
#include <atomic.h>
typedef unsigned int rb_atomic_t;