diff options
-rw-r--r-- | mjit.c | 10 | ||||
-rw-r--r-- | ruby_atomic.h | 4 |
2 files changed, 5 insertions, 9 deletions
@@ -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; |