diff --git a/ext/concurrent-ruby-ext/atomic_boolean.c b/ext/concurrent-ruby-ext/atomic_boolean.c index d4913df56..cdd684245 100644 --- a/ext/concurrent-ruby-ext/atomic_boolean.c +++ b/ext/concurrent-ruby-ext/atomic_boolean.c @@ -7,8 +7,16 @@ void atomic_boolean_mark(void *value) { rb_gc_mark_maybe((VALUE) value); } +const rb_data_type_t atomic_boolean_type = { + "Concurrent::CAtomicBoolean", + { + atomic_boolean_mark, + RUBY_NEVER_FREE, + }, +}; + VALUE atomic_boolean_allocate(VALUE klass) { - return rb_data_object_wrap(klass, (void *) Qfalse, atomic_boolean_mark, NULL); + return rb_data_typed_object_wrap(klass, (void *) Qfalse, &atomic_boolean_type); } VALUE method_atomic_boolean_initialize(int argc, VALUE* argv, VALUE self) { diff --git a/ext/concurrent-ruby-ext/atomic_fixnum.c b/ext/concurrent-ruby-ext/atomic_fixnum.c index faa0ac0ac..088874006 100644 --- a/ext/concurrent-ruby-ext/atomic_fixnum.c +++ b/ext/concurrent-ruby-ext/atomic_fixnum.c @@ -7,8 +7,16 @@ void atomic_fixnum_mark(void *value) { rb_gc_mark_maybe((VALUE) value); } +const rb_data_type_t atomic_fixnum_type = { + "Concurrent::CAtomicFixnum", + { + atomic_fixnum_mark, + RUBY_NEVER_FREE, + }, +}; + VALUE atomic_fixnum_allocate(VALUE klass) { - return rb_data_object_wrap(klass, (void *) Qnil, atomic_fixnum_mark, NULL); + return rb_data_typed_object_wrap(klass, (void *) Qnil, &atomic_fixnum_type); } VALUE method_atomic_fixnum_initialize(int argc, VALUE* argv, VALUE self) { diff --git a/ext/concurrent-ruby-ext/atomic_reference.c b/ext/concurrent-ruby-ext/atomic_reference.c index d99e5afd5..abdbebb7e 100644 --- a/ext/concurrent-ruby-ext/atomic_reference.c +++ b/ext/concurrent-ruby-ext/atomic_reference.c @@ -43,8 +43,16 @@ void ir_mark(void *value) { rb_gc_mark_maybe((VALUE) value); } +const rb_data_type_t ir_type = { + "Concurrent::CAtomicReference", + { + ir_mark, + RUBY_NEVER_FREE, + }, +}; + VALUE ir_alloc(VALUE klass) { - return rb_data_object_wrap(klass, (void *) Qnil, ir_mark, NULL); + return rb_data_typed_object_wrap(klass, (void *) Qnil, &ir_type); } VALUE ir_initialize(int argc, VALUE* argv, VALUE self) { @@ -78,7 +86,11 @@ VALUE ir_get_and_set(VALUE self, VALUE new_value) { } VALUE ir_compare_and_set(volatile VALUE self, VALUE expect_value, VALUE new_value) { -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101200 + if (atomic_compare_exchange_strong_explicit((_Atomic uintptr_t *)&DATA_PTR(self), &expect_value, new_value, memory_order_seq_cst, memory_order_seq_cst)) { + return Qtrue; + } +#elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 if (OSAtomicCompareAndSwap64(expect_value, new_value, &DATA_PTR(self))) { return Qtrue; } diff --git a/ext/concurrent-ruby-ext/atomic_reference.h b/ext/concurrent-ruby-ext/atomic_reference.h index 1f33414a9..34136759c 100644 --- a/ext/concurrent-ruby-ext/atomic_reference.h +++ b/ext/concurrent-ruby-ext/atomic_reference.h @@ -5,6 +5,9 @@ #include #endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101200 +#include +#endif #ifdef HAVE_LIBKERN_OSATOMIC_H #include #endif