From 77b70e10c59f0baec53ab3a31e900bf02d39a592 Mon Sep 17 00:00:00 2001 From: Jerry D'Antonio Date: Sat, 6 Dec 2014 07:34:00 -0500 Subject: [PATCH] Moved C extensions into a companion gem. --- Gemfile | 1 + README.md | 62 ++++--------- Rakefile | 27 ------ concurrent-ruby.gemspec | 9 +- ext/concurrent_ruby_ext/atomic_boolean.c | 48 ---------- ext/concurrent_ruby_ext/atomic_boolean.h | 16 ---- ext/concurrent_ruby_ext/atomic_fixnum.c | 50 ---------- ext/concurrent_ruby_ext/atomic_fixnum.h | 13 --- ext/concurrent_ruby_ext/atomic_reference.c | 91 ------------------- ext/concurrent_ruby_ext/atomic_reference.h | 20 ---- ext/concurrent_ruby_ext/extconf.rb | 58 ------------ ext/concurrent_ruby_ext/rb_concurrent.c | 57 ------------ ext/concurrent_ruby_ext/ruby_193_compatible.h | 28 ------ lib/concurrent/atomic.rb | 2 +- lib/concurrent/atomic/atomic_boolean.rb | 5 +- lib/concurrent/atomic/atomic_fixnum.rb | 5 +- lib/concurrent/atomic_reference/ruby.rb | 37 -------- lib/extension_helper.rb | 19 ---- spec/concurrent/atomic/atomic_boolean_spec.rb | 1 + spec/concurrent/atomic/atomic_fixnum_spec.rb | 1 + spec/concurrent/atomic_spec.rb | 3 +- spec/spec_helper.rb | 2 + spec/support/example_group_extensions.rb | 4 +- 23 files changed, 31 insertions(+), 528 deletions(-) delete mode 100644 ext/concurrent_ruby_ext/atomic_boolean.c delete mode 100644 ext/concurrent_ruby_ext/atomic_boolean.h delete mode 100644 ext/concurrent_ruby_ext/atomic_fixnum.c delete mode 100644 ext/concurrent_ruby_ext/atomic_fixnum.h delete mode 100644 ext/concurrent_ruby_ext/atomic_reference.c delete mode 100644 ext/concurrent_ruby_ext/atomic_reference.h delete mode 100644 ext/concurrent_ruby_ext/extconf.rb delete mode 100644 ext/concurrent_ruby_ext/rb_concurrent.c delete mode 100644 ext/concurrent_ruby_ext/ruby_193_compatible.h delete mode 100644 lib/concurrent/atomic_reference/ruby.rb diff --git a/Gemfile b/Gemfile index 848592d37..3b2cbb54d 100644 --- a/Gemfile +++ b/Gemfile @@ -8,6 +8,7 @@ group :development do end group :testing do + gem 'concurrent-ruby-ext', :platforms => :mri, git: 'https://github.com/ruby-concurrency/concurrent-ruby-ext', branch: 'master' gem 'rspec', '~> 3.0.0' gem 'simplecov', '~> 0.8.2', :require => false gem 'coveralls', '~> 0.7.0', :require => false diff --git a/README.md b/README.md index a4e748365..907078e1e 100644 --- a/README.md +++ b/README.md @@ -38,9 +38,7 @@ ### Supported Ruby versions MRI 1.9.3, 2.0, 2.1, JRuby (1.9 mode), and Rubinius 2.x are supported. -Although native code is used for performance optimizations on some platforms, all functionality -is available in pure Ruby. This gem should be fully compatible with any interpreter that is -compliant with Ruby 1.9.3 or newer. +This gem should be fully compatible with any interpreter that is compliant with Ruby 1.9.3 or newer. ## Features & Documentation @@ -96,30 +94,7 @@ Lower-level abstractions mainly used as building blocks. * [thread-local variables](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ThreadLocalVar.html) * [software transactional memory](./doc/tvar.md) (TVar) - - -## Installing and Building - -This gem includes several platform-specific optimizations. To reduce the possibility of -compilation errors, we provide pre-compiled gem packages for several platforms as well -as a pure-Ruby build. Installing the gem should be no different than installing any other -Rubygems-hosted gem. Rubygems will automatically detect your platform and install the -appropriate pre-compiled build. You should never see Rubygems attempt to compile the gem -on installation. Additionally, to ensure compatability with the largest possible number -of Ruby interpreters, the C extensions will *never* load under any Ruby other than MRI, -even when installed. - -The following gem builds will be built at every release: - -* concurrent-ruby-x.y.z.gem (pure Ruby) -* concurrent-ruby-x.y.z-java.gem (JRuby) -* concurrent-ruby-x.y.z-x86-linux.gem (Linux 32-bit) -* concurrent-ruby-x.y.z-x86_64-linux.gem (Linux 64-bit) -* concurrent-ruby-x.y.z-x86-mingw32.gem (Windows 32-bit) -* concurrent-ruby-x.y.z-x64-mingw32.gem (Windows 64-bit) -* concurrent-ruby-x.y.z-x86-solaris-2.11.gem (Solaris) - -### Installing +## Installing ```shell gem install concurrent-ruby @@ -133,31 +108,28 @@ gem 'concurrent-ruby' and run `bundle install` from your shell. -### Building +### Installing Optional C Extensions (MRI) -Because we provide pre-compiled gem builds, users should never need to build the gem manually. -The build process for this gem is completely automated using open source tools. All of -the automation components are available in the [ruby-concurrency/rake-compiler-dev-box](https://github.com/ruby-concurrency/rake-compiler-dev-box) -GitHub repository. +For improved performance on MRI a compantion gem with called `concurrent-ruby-ext` is provided. When the +extensions are installed `concurrent-ruby` will detect their presence and automatically load them. -This gem will compile native C code under MRI and native Java code under JRuby. It is -also possible to build a pure-Ruby version. All builds have identical functionality. -The only difference is performance. Additionally, pure-Ruby classes are always available, -even when using the native optimizations. Please see the [documentation](http://ruby-concurrency.github.io/concurrent-ruby/) -for more details. +```shell +gem install concurrent-ruby-ext +``` -To build and package the gem using MRI or JRuby, install the necessary build dependencies and run: +or add the following line to Gemfile: -```shell -bundle exec rake compile -bundle exec rake build +```ruby +gem 'concurrent-ruby'-ext ``` -To build and package a pure-Ruby gem, on *any* platform and interpreter -(including MRI and JRuby), run: +and run `bundle install` from your shell. -```shell -BUILD_PURE_RUBY='true' bundle exec rake build +In your code make sure you require the extension gem **before** you require the core gem: + +```ruby +require 'concurrent_ext' +require 'concurrent' ``` ## Maintainers diff --git a/Rakefile b/Rakefile index 094554f72..b905cf289 100644 --- a/Rakefile +++ b/Rakefile @@ -34,30 +34,6 @@ if defined?(JRUBY_VERSION) ext.ext_dir = 'ext' end -elsif Concurrent.allow_c_extensions? - - Rake::ExtensionTask.new(EXTENSION_NAME, GEMSPEC) do |ext| - ext.ext_dir = "ext/#{EXTENSION_NAME}" - ext.cross_compile = true - ext.cross_platform = ['x86-mingw32', 'x64-mingw32'] - end - - ENV['RUBY_CC_VERSION'].to_s.split(':').each do |ruby_version| - platforms = { - 'x86-mingw32' => 'i686-w64-mingw32', - 'x64-mingw32' => 'x86_64-w64-mingw32' - } - platforms.each do |platform, prefix| - task "copy:#{EXTENSION_NAME}:#{platform}:#{ruby_version}" do |t| - %w[lib tmp/#{platform}/stage/lib].each do |dir| - so_file = "#{dir}/#{ruby_version[/^\d+\.\d+/]}/#{EXTENSION_NAME}.so" - if File.exists?(so_file) - sh "#{prefix}-strip -S #{so_file}" - end - end - end - end - end else task :clean task :compile @@ -67,10 +43,7 @@ end Rake::Task[:clean].enhance do rm_rf 'pkg/classes' rm_rf 'tmp' - rm_rf 'lib/1.9' - rm_rf 'lib/2.0' rm_f Dir.glob('./lib/*.jar') - rm_f Dir.glob('./**/*.bundle') end begin diff --git a/concurrent-ruby.gemspec b/concurrent-ruby.gemspec index 63f7142f3..0b88783b5 100644 --- a/concurrent-ruby.gemspec +++ b/concurrent-ruby.gemspec @@ -25,14 +25,9 @@ Gem::Specification.new do |s| if defined?(JRUBY_VERSION) s.files += Dir['lib/concurrent_ruby_ext.jar'] s.platform = 'java' - elsif ! ENV['BUILD_PURE_RUBY'] - s.extensions = 'ext/concurrent_ruby_ext/extconf.rb' - s.files += Dir['ext/**/*.{h,c,cpp}'] + else + s.add_dependency 'ref', '~> 1.0.5' end s.required_ruby_version = '>= 1.9.3' - - unless defined?(JRUBY_VERSION) - s.add_dependency 'ref', '~> 1.0.5' - end end diff --git a/ext/concurrent_ruby_ext/atomic_boolean.c b/ext/concurrent_ruby_ext/atomic_boolean.c deleted file mode 100644 index d86fe2057..000000000 --- a/ext/concurrent_ruby_ext/atomic_boolean.c +++ /dev/null @@ -1,48 +0,0 @@ -#include - -#include "atomic_boolean.h" -#include "atomic_reference.h" -#include "ruby_193_compatible.h" - -void atomic_boolean_mark(void *value) { - rb_gc_mark_maybe((VALUE) value); -} - -VALUE atomic_boolean_allocate(VALUE klass) { - return rb_data_object_alloc(klass, (void *) Qfalse, atomic_boolean_mark, NULL); -} - -VALUE method_atomic_boolean_initialize(int argc, VALUE* argv, VALUE self) { - VALUE value = Qfalse; - rb_check_arity(argc, 0, 1); - if (argc == 1) value = TRUTHY(argv[0]); - DATA_PTR(self) = (void *) value; - return(self); -} - -VALUE method_atomic_boolean_value(VALUE self) { - return (VALUE) DATA_PTR(self); -} - -VALUE method_atomic_boolean_value_set(VALUE self, VALUE value) { - VALUE new_value = TRUTHY(value); - DATA_PTR(self) = (void *) new_value; - return(new_value); -} - -VALUE method_atomic_boolean_true_question(VALUE self) { - return(method_atomic_boolean_value(self)); -} - -VALUE method_atomic_boolean_false_question(VALUE self) { - VALUE current = method_atomic_boolean_value(self); - return(current == Qfalse ? Qtrue : Qfalse); -} - -VALUE method_atomic_boolean_make_true(VALUE self) { - return(ir_compare_and_set(self, Qfalse, Qtrue)); -} - -VALUE method_atomic_boolean_make_false(VALUE self) { - return(ir_compare_and_set(self, Qtrue, Qfalse)); -} diff --git a/ext/concurrent_ruby_ext/atomic_boolean.h b/ext/concurrent_ruby_ext/atomic_boolean.h deleted file mode 100644 index 71e7d059e..000000000 --- a/ext/concurrent_ruby_ext/atomic_boolean.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __ATOMIC_BOOLEAN_H__ -#define __ATOMIC_BOOLEAN_H__ - -#define TRUTHY(value)(value == Qfalse || value == Qnil ? Qfalse : Qtrue) - -void atomic_boolean_mark(void*); -VALUE atomic_boolean_allocate(VALUE); -VALUE method_atomic_boolean_initialize(int, VALUE*, VALUE); -VALUE method_atomic_boolean_value(VALUE); -VALUE method_atomic_boolean_value_set(VALUE, VALUE); -VALUE method_atomic_boolean_true_question(VALUE); -VALUE method_atomic_boolean_false_question(VALUE); -VALUE method_atomic_boolean_make_true(VALUE); -VALUE method_atomic_boolean_make_false(VALUE); - -#endif diff --git a/ext/concurrent_ruby_ext/atomic_fixnum.c b/ext/concurrent_ruby_ext/atomic_fixnum.c deleted file mode 100644 index 20404ba95..000000000 --- a/ext/concurrent_ruby_ext/atomic_fixnum.c +++ /dev/null @@ -1,50 +0,0 @@ -#include - -#include "atomic_fixnum.h" -#include "atomic_reference.h" -#include "ruby_193_compatible.h" - -void atomic_fixnum_mark(void *value) { - rb_gc_mark_maybe((VALUE) value); -} - -VALUE atomic_fixnum_allocate(VALUE klass) { - return rb_data_object_alloc(klass, (void *) Qnil, atomic_fixnum_mark, NULL); -} - -VALUE method_atomic_fixnum_initialize(int argc, VALUE* argv, VALUE self) { - VALUE value = LL2NUM(0); - rb_check_arity(argc, 0, 1); - if (argc == 1) { - Check_Type(argv[0], T_FIXNUM); - value = argv[0]; - } - DATA_PTR(self) = (void *) value; - return(self); -} - -VALUE method_atomic_fixnum_value(VALUE self) { - return (VALUE) DATA_PTR(self); -} - -VALUE method_atomic_fixnum_value_set(VALUE self, VALUE value) { - Check_Type(value, T_FIXNUM); - DATA_PTR(self) = (void *) value; - return(value); -} - -VALUE method_atomic_fixnum_increment(VALUE self) { - long long value = NUM2LL((VALUE) DATA_PTR(self)); - return method_atomic_fixnum_value_set(self, LL2NUM(value + 1)); -} - -VALUE method_atomic_fixnum_decrement(VALUE self) { - long long value = NUM2LL((VALUE) DATA_PTR(self)); - return method_atomic_fixnum_value_set(self, LL2NUM(value - 1)); -} - -VALUE method_atomic_fixnum_compare_and_set(VALUE self, VALUE rb_expect, VALUE rb_update) { - Check_Type(rb_expect, T_FIXNUM); - Check_Type(rb_update, T_FIXNUM); - return ir_compare_and_set(self, rb_expect, rb_update); -} diff --git a/ext/concurrent_ruby_ext/atomic_fixnum.h b/ext/concurrent_ruby_ext/atomic_fixnum.h deleted file mode 100644 index c86dc8cd9..000000000 --- a/ext/concurrent_ruby_ext/atomic_fixnum.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef __ATOMIC_FIXNUM_H__ -#define __ATOMIC_FIXNUM_H__ - -void atomic_fixnum_mark(void*); -VALUE atomic_fixnum_allocate(VALUE); -VALUE method_atomic_fixnum_initialize(int, VALUE*, VALUE); -VALUE method_atomic_fixnum_value(VALUE); -VALUE method_atomic_fixnum_value_set(VALUE, VALUE); -VALUE method_atomic_fixnum_increment(VALUE); -VALUE method_atomic_fixnum_decrement(VALUE); -VALUE method_atomic_fixnum_compare_and_set(VALUE, VALUE, VALUE); - -#endif diff --git a/ext/concurrent_ruby_ext/atomic_reference.c b/ext/concurrent_ruby_ext/atomic_reference.c deleted file mode 100644 index e34fe4a2c..000000000 --- a/ext/concurrent_ruby_ext/atomic_reference.c +++ /dev/null @@ -1,91 +0,0 @@ -#include -/*#if defined(__sun)*/ -/*#include */ -/*#endif*/ - -/*#ifdef HAVE_LIBKERN_OSATOMIC_H*/ -/*#include */ -/*#endif*/ - -#include "atomic_reference.h" - -void ir_mark(void *value) { - rb_gc_mark_maybe((VALUE) value); -} - -VALUE ir_alloc(VALUE klass) { - return rb_data_object_alloc(klass, (void *) Qnil, ir_mark, NULL); -} - -VALUE ir_initialize(int argc, VALUE* argv, VALUE self) { - VALUE value = Qnil; - if (rb_scan_args(argc, argv, "01", &value) == 1) { - value = argv[0]; - } - DATA_PTR(self) = (void *) value; - return Qnil; -} - -VALUE ir_get(VALUE self) { -#if HAVE_GCC_SYNC - __sync_synchronize(); -#elif defined _MSC_VER - MemoryBarrier(); -#elif __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 - OSMemoryBarrier(); -#endif - return (VALUE) DATA_PTR(self); -} - -VALUE ir_set(VALUE self, VALUE new_value) { - DATA_PTR(self) = (void *) new_value; -#if HAVE_GCC_SYNC - __sync_synchronize(); -#elif defined _MSC_VER - MemoryBarrier(); -#elif __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 - OSMemoryBarrier(); -#endif - return new_value; -} - -VALUE ir_get_and_set(VALUE self, VALUE new_value) { - VALUE old_value = ir_get(self); - ir_set(self, new_value); - return old_value; -} - -VALUE ir_compare_and_set(volatile VALUE self, VALUE expect_value, VALUE new_value) { -#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 - if (OSAtomicCompareAndSwap64(expect_value, new_value, &DATA_PTR(self))) { - return Qtrue; - } -#elif defined(__sun) - /* Assuming VALUE is uintptr_t */ - /* Based on the definition of uintptr_t from /usr/include/sys/int_types.h */ -#if defined(_LP64) || defined(_I32LPx) - /* 64-bit: uintptr_t === unsigned long */ - if (atomic_cas_ulong((uintptr_t *) &DATA_PTR(self), expect_value, new_value)) { - return Qtrue; - } -#else - /* 32-bit: uintptr_t === unsigned int */ - if (atomic_cas_uint((uintptr_t *) &DATA_PTR(self), expect_value, new_value)) { - return Qtrue; - } -#endif -#elif defined _MSC_VER && defined _M_AMD64 - if (InterlockedCompareExchange64((LONGLONG*)&DATA_PTR(self), new_value, expect_value)) { - return Qtrue; - } -#elif defined _MSC_VER && defined _M_IX86 - if (InterlockedCompareExchange((LONG*)&DATA_PTR(self), new_value, expect_value)) { - return Qtrue; - } -#else - if (__sync_bool_compare_and_swap(&DATA_PTR(self), expect_value, new_value)) { - return Qtrue; - } -#endif - return Qfalse; -} diff --git a/ext/concurrent_ruby_ext/atomic_reference.h b/ext/concurrent_ruby_ext/atomic_reference.h deleted file mode 100644 index 1f33414a9..000000000 --- a/ext/concurrent_ruby_ext/atomic_reference.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __ATOMIC_REFERENCE_H__ -#define __ATOMIC_REFERENCE_H__ - -#if defined(__sun) -#include -#endif - -#ifdef HAVE_LIBKERN_OSATOMIC_H -#include -#endif - -void ir_mark(void*); -VALUE ir_alloc(VALUE); -VALUE ir_initialize(int, VALUE*, VALUE); -VALUE ir_get(VALUE); -VALUE ir_set(VALUE, VALUE); -VALUE ir_get_and_set(VALUE, VALUE); -VALUE ir_compare_and_set(volatile VALUE, VALUE, VALUE); - -#endif diff --git a/ext/concurrent_ruby_ext/extconf.rb b/ext/concurrent_ruby_ext/extconf.rb deleted file mode 100644 index eb635c2f9..000000000 --- a/ext/concurrent_ruby_ext/extconf.rb +++ /dev/null @@ -1,58 +0,0 @@ -require 'fileutils' - -$:.push File.join(File.dirname(__FILE__), '../../lib') -require 'extension_helper' - -EXTENSION_NAME = 'concurrent_ruby_ext' - -def create_dummy_makefile - File.open('Makefile', 'w') do |f| - f.puts 'all:' - f.puts 'install:' - end -end - -if defined?(JRUBY_VERSION) || ! Concurrent.allow_c_extensions? - create_dummy_makefile - warn 'C optimizations are not supported on this version of Ruby.' -else - begin - - require 'mkmf' - dir_config(EXTENSION_NAME) - - have_header "libkern/OSAtomic.h" - - def compiler_is_gcc - if CONFIG["GCC"] && CONFIG["GCC"] != "" - return true - elsif ( # This could stand to be more generic... but I am afraid. - CONFIG["CC"] =~ /\bgcc\b/ - ) - return true - end - return false - end - - if compiler_is_gcc - case CONFIG["arch"] - when /mswin32|mingw|solaris/ - $CFLAGS += " -march=native" - when 'i686-linux' - $CFLAGS += " -march=i686" - end - end - - try_run(< - -#include "atomic_reference.h" -#include "atomic_boolean.h" -#include "atomic_fixnum.h" - -// module and class definitions - -static VALUE rb_mConcurrent; -static VALUE rb_cAtomic; -static VALUE rb_cAtomicBoolean; -static VALUE rb_cAtomicFixnum; - -// Init_concurrent_ruby_ext - -void Init_concurrent_ruby_ext() { - - // define modules and classes - rb_mConcurrent = rb_define_module("Concurrent"); - rb_cAtomic = rb_define_class_under(rb_mConcurrent, "CAtomic", rb_cObject); - rb_cAtomicBoolean = rb_define_class_under(rb_mConcurrent, "CAtomicBoolean", rb_cObject); - rb_cAtomicFixnum = rb_define_class_under(rb_mConcurrent, "CAtomicFixnum", rb_cObject); - - // CAtomic - rb_define_alloc_func(rb_cAtomic, ir_alloc); - rb_define_method(rb_cAtomic, "initialize", ir_initialize, -1); - rb_define_method(rb_cAtomic, "get", ir_get, 0); - rb_define_method(rb_cAtomic, "set", ir_set, 1); - rb_define_method(rb_cAtomic, "get_and_set", ir_get_and_set, 1); - rb_define_method(rb_cAtomic, "_compare_and_set", ir_compare_and_set, 2); - rb_define_alias(rb_cAtomic, "value", "get"); - rb_define_alias(rb_cAtomic, "value=", "set"); - rb_define_alias(rb_cAtomic, "swap", "get_and_set"); - - // CAtomicBoolean - rb_define_alloc_func(rb_cAtomicBoolean, atomic_boolean_allocate); - rb_define_method(rb_cAtomicBoolean, "initialize", method_atomic_boolean_initialize, -1); - rb_define_method(rb_cAtomicBoolean, "value", method_atomic_boolean_value, 0); - rb_define_method(rb_cAtomicBoolean, "value=", method_atomic_boolean_value_set, 1); - rb_define_method(rb_cAtomicBoolean, "true?", method_atomic_boolean_true_question, 0); - rb_define_method(rb_cAtomicBoolean, "false?", method_atomic_boolean_false_question, 0); - rb_define_method(rb_cAtomicBoolean, "make_true", method_atomic_boolean_make_true, 0); - rb_define_method(rb_cAtomicBoolean, "make_false", method_atomic_boolean_make_false, 0); - - // CAtomicFixnum - rb_define_const(rb_cAtomicFixnum, "MIN_VALUE", LL2NUM(LLONG_MIN)); - rb_define_const(rb_cAtomicFixnum, "MAX_VALUE", LL2NUM(LLONG_MAX)); - rb_define_alloc_func(rb_cAtomicFixnum, atomic_fixnum_allocate); - rb_define_method(rb_cAtomicFixnum, "initialize", method_atomic_fixnum_initialize, -1); - rb_define_method(rb_cAtomicFixnum, "value", method_atomic_fixnum_value, 0); - rb_define_method(rb_cAtomicFixnum, "value=", method_atomic_fixnum_value_set, 1); - rb_define_method(rb_cAtomicFixnum, "increment", method_atomic_fixnum_increment, 0); - rb_define_method(rb_cAtomicFixnum, "decrement", method_atomic_fixnum_decrement, 0); - rb_define_method(rb_cAtomicFixnum, "compare_and_set", method_atomic_fixnum_compare_and_set, 2); - rb_define_alias(rb_cAtomicFixnum, "up", "increment"); - rb_define_alias(rb_cAtomicFixnum, "down", "decrement"); -} diff --git a/ext/concurrent_ruby_ext/ruby_193_compatible.h b/ext/concurrent_ruby_ext/ruby_193_compatible.h deleted file mode 100644 index d636068fe..000000000 --- a/ext/concurrent_ruby_ext/ruby_193_compatible.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef rb_check_arity - -// https://github.com/ruby/ruby/blob/ruby_2_0_0/include/ruby/intern.h -// rb_check_arity was added in Ruby 2.0 - -#define UNLIMITED_ARGUMENTS (-1) - -static inline void rb_error_arity(int argc, int min, int max) -{ - VALUE err_mess = 0; - if (min == max) { - err_mess = rb_sprintf("wrong number of arguments (%d for %d)", argc, min); - } - else if (max == UNLIMITED_ARGUMENTS) { - err_mess = rb_sprintf("wrong number of arguments (%d for %d+)", argc, min); - } - else { - err_mess = rb_sprintf("wrong number of arguments (%d for %d..%d)", argc, min, max); - } - rb_raise(rb_eTypeError, err_mess); -} - -#define rb_check_arity(argc, min, max) do { \ - if (((argc) < (min)) || ((argc) > (max) && (max) != UNLIMITED_ARGUMENTS)) \ - rb_error_arity(argc, min, max); \ -} while(0) - -#endif diff --git a/lib/concurrent/atomic.rb b/lib/concurrent/atomic.rb index ab65c2bae..bff4d794a 100644 --- a/lib/concurrent/atomic.rb +++ b/lib/concurrent/atomic.rb @@ -77,7 +77,7 @@ class Concurrent::Atomic < Concurrent::JavaAtomic class Concurrent::Atomic < Concurrent::RbxAtomic end -elsif Concurrent.allow_c_native_class?('CAtomic') +elsif defined? Concurrent::CAtomic # @!macro atomic_reference class Concurrent::Atomic < Concurrent::CAtomic diff --git a/lib/concurrent/atomic/atomic_boolean.rb b/lib/concurrent/atomic/atomic_boolean.rb index 2e88b2414..02e51432b 100644 --- a/lib/concurrent/atomic/atomic_boolean.rb +++ b/lib/concurrent/atomic/atomic_boolean.rb @@ -1,6 +1,3 @@ -require_relative '../../extension_helper' -Concurrent.safe_require_c_extensions - module Concurrent # @!macro [attach] atomic_boolean @@ -162,7 +159,7 @@ def make_false class AtomicBoolean < JavaAtomicBoolean end - elsif Concurrent.allow_c_native_class?('CAtomicBoolean') + elsif defined? Concurrent::CAtomicBoolean # @!macro atomic_boolean class CAtomicBoolean diff --git a/lib/concurrent/atomic/atomic_fixnum.rb b/lib/concurrent/atomic/atomic_fixnum.rb index a1a2357a4..3049862bd 100644 --- a/lib/concurrent/atomic/atomic_fixnum.rb +++ b/lib/concurrent/atomic/atomic_fixnum.rb @@ -1,6 +1,3 @@ -require_relative '../../extension_helper' -Concurrent.safe_require_c_extensions - module Concurrent # @!macro [attach] atomic_fixnum @@ -166,7 +163,7 @@ def compare_and_set(expect, update) class AtomicFixnum < JavaAtomicFixnum end - elsif Concurrent.allow_c_native_class?('CAtomicFixnum') + elsif defined? Concurrent::CAtomicFixnum # @!macro atomic_fixnum class CAtomicFixnum diff --git a/lib/concurrent/atomic_reference/ruby.rb b/lib/concurrent/atomic_reference/ruby.rb deleted file mode 100644 index 437e1d3e4..000000000 --- a/lib/concurrent/atomic_reference/ruby.rb +++ /dev/null @@ -1,37 +0,0 @@ -require_relative '../../extension_helper' - -if Concurrent.allow_c_extensions? - begin - require 'concurrent_ruby_ext' - rescue LoadError - # may be a Windows cross-compiled native gem - require "#{RUBY_VERSION[0..2]}/concurrent_ruby_ext" - end -end - -require 'concurrent/atomic_reference/direct_update' -require 'concurrent/atomic_reference/numeric_cas_wrapper' - -module Concurrent - - # @!macro atomic_reference - class CAtomic - include Concurrent::AtomicDirectUpdate - include Concurrent::AtomicNumericCompareAndSetWrapper - - # @!method initialize - # @!macro atomic_reference_method_initialize - - # @!method get - # @!macro atomic_reference_method_get - - # @!method set - # @!macro atomic_reference_method_set - - # @!method get_and_set - # @!macro atomic_reference_method_get_and_set - - # @!method _compare_and_set - # @!macro atomic_reference_method_compare_and_set - end -end diff --git a/lib/extension_helper.rb b/lib/extension_helper.rb index a342b598f..a5b71c584 100644 --- a/lib/extension_helper.rb +++ b/lib/extension_helper.rb @@ -1,24 +1,5 @@ module Concurrent - # @!visibility private - def self.allow_c_extensions? - defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby' - end - - # @!visibility private - def self.allow_c_native_class?(clazz) - allow_c_extensions? && Concurrent.const_defined?(clazz) - rescue - false - end - - # @!visibility private - def self.safe_require_c_extensions - require 'concurrent_ruby_ext' if allow_c_extensions? - rescue LoadError - #warn 'Attempted to load C extensions on unsupported platform. Continuing with pure-Ruby.' - end - # @!visibility private def self.safe_require_java_extensions require 'concurrent_ruby_ext' if RUBY_PLATFORM == 'java' diff --git a/spec/concurrent/atomic/atomic_boolean_spec.rb b/spec/concurrent/atomic/atomic_boolean_spec.rb index 573a97815..10d0400bf 100644 --- a/spec/concurrent/atomic/atomic_boolean_spec.rb +++ b/spec/concurrent/atomic/atomic_boolean_spec.rb @@ -178,6 +178,7 @@ module Concurrent end elsif defined? Concurrent::CAtomicBoolean it 'inherits from CAtomicBoolean' do + pending('first release of concurrent-ruby-ext') expect(AtomicBoolean.ancestors).to include(CAtomicBoolean) end else diff --git a/spec/concurrent/atomic/atomic_fixnum_spec.rb b/spec/concurrent/atomic/atomic_fixnum_spec.rb index ae4e7e832..3b8438901 100644 --- a/spec/concurrent/atomic/atomic_fixnum_spec.rb +++ b/spec/concurrent/atomic/atomic_fixnum_spec.rb @@ -192,6 +192,7 @@ module Concurrent end elsif defined? Concurrent::CAtomicFixnum it 'inherits from CAtomicFixnum' do + pending('first release of concurrent-ruby-ext') expect(AtomicFixnum.ancestors).to include(CAtomicFixnum) end else diff --git a/spec/concurrent/atomic_spec.rb b/spec/concurrent/atomic_spec.rb index f7343a9b9..026df36e1 100644 --- a/spec/concurrent/atomic_spec.rb +++ b/spec/concurrent/atomic_spec.rb @@ -156,8 +156,9 @@ module Concurrent it 'inherits from JavaAtomic' do expect(Atomic.ancestors).to include(JavaAtomic) end - elsif TestHelpers.use_c_extensions? + elsif TestHelpers.c_extensions? it 'inherits from CAtomic' do + pending('first release of concurrent-ruby-ext') expect(Atomic.ancestors).to include(CAtomic) end elsif TestHelpers.rbx? diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index faaae3992..530dea033 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -16,6 +16,8 @@ end require 'concurrent' +require 'concurrent_ext' if RUBY_ENGINE == 'ruby' + logger = Logger.new($stderr) logger.level = Logger::WARN diff --git a/spec/support/example_group_extensions.rb b/spec/support/example_group_extensions.rb index c99b64eb9..63e0c237f 100644 --- a/spec/support/example_group_extensions.rb +++ b/spec/support/example_group_extensions.rb @@ -23,8 +23,8 @@ def rbx? RUBY_ENGINE == 'rbx' end - def use_c_extensions? - Concurrent.allow_c_extensions? # from extension_helper.rb + def c_extensions? + defined? Concurrent::CAtomic end def do_no_reset!