Skip to content

Commit

Permalink
Builds two gems from one repo. Specs and docs need updated.
Browse files Browse the repository at this point in the history
  • Loading branch information
jdantonio committed Dec 11, 2014
1 parent 29cd69a commit 9caecc5
Show file tree
Hide file tree
Showing 16 changed files with 106 additions and 60 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
source 'https://rubygems.org'

gemspec
gemspec name: 'concurrent-ruby'

group :development do
gem 'rake', '~> 10.3.2'
Expand Down
46 changes: 35 additions & 11 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
require 'bundler/gem_tasks'
require 'rake/extensiontask'
require 'rake/javaextensiontask'

GEMSPEC = Gem::Specification.load('concurrent-ruby.gemspec')
CORE_GEMSPEC = Gem::Specification.load('concurrent-ruby.gemspec')
EXT_GEMSPEC = Gem::Specification.load('concurrent-ruby-ext.gemspec')
EXTENSION_NAME = 'concurrent_ruby_ext'

Bundler::GemHelper.install_tasks

$:.push File.join(File.dirname(__FILE__), 'lib')
require 'extension_helper'

Expand All @@ -23,20 +18,22 @@ Dir.glob('tasks/**/*.rake').each do |rakefile|
safe_load rakefile
end

desc 'Run benchmarks'
#desc 'Run benchmarks'
task :bench do
exec 'ruby -Ilib -Iext examples/bench_atomic.rb'
end

if defined?(JRUBY_VERSION)
require 'rake/javaextensiontask'

Rake::JavaExtensionTask.new(EXTENSION_NAME, GEMSPEC) do |ext|
Rake::JavaExtensionTask.new(EXTENSION_NAME, CORE_GEMSPEC) do |ext|
ext.ext_dir = 'ext'
end

elsif Concurrent.allow_c_extensions?
require 'rake/extensiontask'

Rake::ExtensionTask.new(EXTENSION_NAME, GEMSPEC) do |ext|
Rake::ExtensionTask.new(EXTENSION_NAME, EXT_GEMSPEC) do |ext|
ext.ext_dir = "ext/#{EXTENSION_NAME}"
ext.cross_compile = true
ext.cross_platform = ['x86-mingw32', 'x64-mingw32']
Expand All @@ -61,7 +58,6 @@ elsif Concurrent.allow_c_extensions?
else
task :clean
task :compile
task "compile:#{EXTENSION_NAME}"
end

Rake::Task[:clean].enhance do
Expand All @@ -71,6 +67,7 @@ Rake::Task[:clean].enhance do
rm_rf 'lib/2.0'
rm_f Dir.glob('./lib/*.jar')
rm_f Dir.glob('./**/*.bundle')
mkdir_p 'pkg'
end

begin
Expand All @@ -85,3 +82,30 @@ begin
rescue LoadError
puts 'Error loading Rspec rake tasks, probably building the gem...'
end

namespace :build do

build_deps = [:clean]
build_deps << :compile if defined?(JRUBY_VERSION)

desc 'Build the concurrent-ruby gem'
task :core => build_deps do
sh "gem build #{CORE_GEMSPEC.name}.gemspec"
sh 'mv *.gem pkg/'
Rake::Task[:clean].execute
end

if Concurrent.allow_c_extensions?
desc 'Build the concurrent-ruby-ext gem'
task :ext => [:clean, :compile] do
sh "gem build #{EXT_GEMSPEC.name}.gemspec"
sh 'mv *.gem pkg/'
Rake::Task[:clean].execute
end
else
task :ext
end
end

desc 'Build all gems for this platform'
task :build => ['build:core', 'build:ext']
30 changes: 30 additions & 0 deletions concurrent-ruby-ext.gemspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
Gem::Specification.new do |s|
s.name = 'concurrent-ruby-ext'
s.version = '0.1.0.pre1'
s.platform = Gem::Platform::RUBY
s.author = "Jerry D'Antonio"
s.email = 'jerry.dantonio@gmail.com'
s.homepage = 'http://www.concurrent-ruby.com'
s.summary = 'C extensions to optimize concurrent-ruby under MRI.'
s.license = 'MIT'
s.date = Time.now.strftime('%Y-%m-%d')

s.description = <<-EOF
Modern concurrency tools including agents, futures, promises, thread pools, actors, supervisors, and more.
Inspired by Erlang, Clojure, Go, JavaScript, actors, and classic concurrency patterns.
EOF

s.files = Dir['ext/**/*.{h,c,cpp}']
s.files += [
'lib/concurrent/atomic_reference/concurrent_update_error.rb',
'lib/concurrent/atomic_reference/direct_update.rb',
'lib/concurrent/atomic_reference/numeric_cas_wrapper.rb',
]
s.extra_rdoc_files = Dir['README*', 'LICENSE*', 'CHANGELOG*']
s.require_paths = ['lib']
s.extensions = 'ext/concurrent_ruby_ext/extconf.rb'

s.required_ruby_version = '>= 1.9.3'

s.add_runtime_dependency 'concurrent-ruby', '~> 0.8.0.pre1'
end
9 changes: 2 additions & 7 deletions concurrent-ruby.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -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_runtime_dependency 'ref', '~> 1.0', '>= 1.0.5'
end

s.required_ruby_version = '>= 1.9.3'

unless defined?(JRUBY_VERSION)
s.add_dependency 'ref', '~> 1.0.5'
end
end
2 changes: 1 addition & 1 deletion examples/atomic_example.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
require 'concurrent'
require 'concurrent/atomic'

my_atomic = Concurrent::Atomic.new(0)
my_atomic.update {|v| v + 1}
Expand Down
3 changes: 2 additions & 1 deletion examples/bench_atomic.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
require 'benchmark'
require 'rbconfig'
require 'thread'
require 'concurrent'
require 'concurrent/atomic'

Thread.abort_on_exception = true

$go = false # for synchronizing parallel threads
Expand Down
6 changes: 5 additions & 1 deletion examples/bench_atomic_1.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
require 'thread'
require 'benchmark'

require 'concurrent'
begin
require 'concurrent-ext'
rescue LoadError
require 'concurrent'
end

Thread.abort_on_exception = true

Expand Down
2 changes: 1 addition & 1 deletion examples/benchmark_atomic_boolean.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

$:.push File.join(File.dirname(__FILE__), '../lib')

require 'concurrent'
require 'concurrent/atomics'
require 'benchmark'
require 'rbconfig'

Expand Down
2 changes: 1 addition & 1 deletion examples/benchmark_atomic_fixnum.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

$:.push File.join(File.dirname(__FILE__), '../lib')

require 'concurrent'
require 'concurrent/atomics'
require 'benchmark'
require 'rbconfig'

Expand Down
3 changes: 2 additions & 1 deletion lib/concurrent/atomic.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
end
#####################################################################

require_relative '../extension_helper'
require 'concurrent/atomic_reference/concurrent_update_error'
require 'concurrent/atomic_reference/mutex_atomic'

Expand Down Expand Up @@ -77,7 +78,7 @@ class Concurrent::Atomic < Concurrent::JavaAtomic
class Concurrent::Atomic < Concurrent::RbxAtomic
end

elsif Concurrent.allow_c_native_class?('CAtomic')
elsif defined?(CAtomic)

# @!macro atomic_reference
class Concurrent::Atomic < Concurrent::CAtomic
Expand Down
3 changes: 1 addition & 2 deletions lib/concurrent/atomic/atomic_boolean.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
require_relative '../../extension_helper'
Concurrent.safe_require_c_extensions

module Concurrent

Expand Down Expand Up @@ -162,7 +161,7 @@ def make_false
class AtomicBoolean < JavaAtomicBoolean
end

elsif Concurrent.allow_c_native_class?('CAtomicBoolean')
elsif defined?(CAtomicBoolean)

# @!macro atomic_boolean
class CAtomicBoolean
Expand Down
3 changes: 1 addition & 2 deletions lib/concurrent/atomic/atomic_fixnum.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
require_relative '../../extension_helper'
Concurrent.safe_require_c_extensions

module Concurrent

Expand Down Expand Up @@ -166,7 +165,7 @@ def compare_and_set(expect, update)
class AtomicFixnum < JavaAtomicFixnum
end

elsif Concurrent.allow_c_native_class?('CAtomicFixnum')
elsif defined?(CAtomicFixnum)

# @!macro atomic_fixnum
class CAtomicFixnum
Expand Down
1 change: 0 additions & 1 deletion lib/concurrent/atomic_reference/jruby.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
require_relative '../../extension_helper'
Concurrent.safe_require_java_extensions

if defined?(Concurrent::JavaAtomic)
require 'concurrent/atomic_reference/direct_update'
Expand Down
10 changes: 0 additions & 10 deletions lib/concurrent/atomic_reference/ruby.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,4 @@
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'

Expand Down
2 changes: 1 addition & 1 deletion lib/concurrent/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module Concurrent
VERSION = '0.7.1'
VERSION = '0.8.0.pre1'
end
42 changes: 23 additions & 19 deletions lib/extension_helper.rb
Original file line number Diff line number Diff line change
@@ -1,28 +1,32 @@
module Concurrent

@@c_ext_loaded ||= false
@@java_ext_loaded ||= false

# @!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'
rescue LoadError
#warn 'Attempted to load Java extensions on unsupported platform. Continuing with pure-Ruby.'
if allow_c_extensions? && !@@c_ext_loaded
begin
require 'concurrent_ruby_ext'
@@c_ext_loaded = true
rescue LoadError
# may be a Windows cross-compiled native gem
begin
require "#{RUBY_VERSION[0..2]}/concurrent_ruby_ext"
@@c_ext_loaded = true
rescue LoadError
warn 'Performance on MRI may be improved with the concurrent-ruby-ext gem. Please see http://concurrent-ruby.com'
end
end
elsif RUBY_PLATFORM == 'java' && !@@java_ext_loaded
begin
require 'concurrent_ruby_ext'
@@java_ext_loaded = true
rescue LoadError
#warn 'Attempted to load Java extensions on unsupported platform. Continuing with pure-Ruby.'
end
end
end

0 comments on commit 9caecc5

Please sign in to comment.