Skip to content

Commit 0ac67e6

Browse files
committed
Merge branch 'master' into devel
* master: (16 commits) Deprecated Concurrent::Atomic in lieu of Concurrent::AtomicReference. ...
2 parents 113fe07 + 9f897f3 commit 0ac67e6

37 files changed

+755
-568
lines changed

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ group :development do
77
gem 'rake', '~> 10.4.2'
88
gem 'rake-compiler', '~> 0.9.5'
99
gem 'gem-compiler', '~> 0.3.0'
10-
gem 'benchmark-ips'
10+
gem 'benchmark-ips', '~> 2.1.1'
1111
end
1212

1313
group :testing do

ext/com/concurrent_ruby/ext/AtomicReferenceLibrary.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
public class AtomicReferenceLibrary implements Library {
2626
public void load(Ruby runtime, boolean wrap) throws IOException {
2727
RubyModule concurrentMod = runtime.defineModule("Concurrent");
28-
RubyClass atomicCls = concurrentMod.defineClassUnder("JavaAtomic", runtime.getObject(), JRUBYREFERENCE_ALLOCATOR);
28+
RubyClass atomicCls = concurrentMod.defineClassUnder("JavaAtomicReference", runtime.getObject(), JRUBYREFERENCE_ALLOCATOR);
2929
try {
3030
sun.misc.Unsafe.class.getMethod("getAndSetObject", Object.class);
3131
atomicCls.setAllocator(JRUBYREFERENCE8_ALLOCATOR);

ext/concurrent/rb_concurrent.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
// module and class definitions
88

99
static VALUE rb_mConcurrent;
10-
static VALUE rb_cAtomic;
10+
static VALUE rb_cAtomicReference;
1111
static VALUE rb_cAtomicBoolean;
1212
static VALUE rb_cAtomicFixnum;
1313

@@ -17,20 +17,20 @@ void Init_extension() {
1717

1818
// define modules and classes
1919
rb_mConcurrent = rb_define_module("Concurrent");
20-
rb_cAtomic = rb_define_class_under(rb_mConcurrent, "CAtomic", rb_cObject);
20+
rb_cAtomicReference = rb_define_class_under(rb_mConcurrent, "CAtomicReference", rb_cObject);
2121
rb_cAtomicBoolean = rb_define_class_under(rb_mConcurrent, "CAtomicBoolean", rb_cObject);
2222
rb_cAtomicFixnum = rb_define_class_under(rb_mConcurrent, "CAtomicFixnum", rb_cObject);
2323

24-
// CAtomic
25-
rb_define_alloc_func(rb_cAtomic, ir_alloc);
26-
rb_define_method(rb_cAtomic, "initialize", ir_initialize, -1);
27-
rb_define_method(rb_cAtomic, "get", ir_get, 0);
28-
rb_define_method(rb_cAtomic, "set", ir_set, 1);
29-
rb_define_method(rb_cAtomic, "get_and_set", ir_get_and_set, 1);
30-
rb_define_method(rb_cAtomic, "_compare_and_set", ir_compare_and_set, 2);
31-
rb_define_alias(rb_cAtomic, "value", "get");
32-
rb_define_alias(rb_cAtomic, "value=", "set");
33-
rb_define_alias(rb_cAtomic, "swap", "get_and_set");
24+
// CAtomicReference
25+
rb_define_alloc_func(rb_cAtomicReference, ir_alloc);
26+
rb_define_method(rb_cAtomicReference, "initialize", ir_initialize, -1);
27+
rb_define_method(rb_cAtomicReference, "get", ir_get, 0);
28+
rb_define_method(rb_cAtomicReference, "set", ir_set, 1);
29+
rb_define_method(rb_cAtomicReference, "get_and_set", ir_get_and_set, 1);
30+
rb_define_method(rb_cAtomicReference, "_compare_and_set", ir_compare_and_set, 2);
31+
rb_define_alias(rb_cAtomicReference, "value", "get");
32+
rb_define_alias(rb_cAtomicReference, "value=", "set");
33+
rb_define_alias(rb_cAtomicReference, "swap", "get_and_set");
3434

3535
// CAtomicBoolean
3636
rb_define_alloc_func(rb_cAtomicBoolean, atomic_boolean_allocate);

lib/concurrent.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@
1111
require 'concurrent/executors'
1212
require 'concurrent/utilities'
1313

14-
require 'concurrent/atomic'
14+
require 'concurrent/atomic/atomic_reference'
1515
require 'concurrent/agent'
1616
require 'concurrent/async'
17-
require 'concurrent/atomic'
1817
require 'concurrent/dataflow'
1918
require 'concurrent/delay'
2019
require 'concurrent/exchanger'

lib/concurrent/agent.rb

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,7 @@ class Agent
2222
#
2323
# @param [Object] initial the initial value
2424
#
25-
# @!macro [attach] executor_and_deref_options
26-
#
27-
# @param [Hash] opts the options used to define the behavior at update and deref
28-
# and to specify the executor on which to perform actions
29-
# @option opts [Executor] :executor when set use the given `Executor` instance.
30-
# Three special values are also supported: `:task` returns the global task pool,
31-
# `:operation` returns the global operation pool, and `:immediate` returns a new
32-
# `ImmediateExecutor` object.
33-
# @option opts [Boolean] :dup_on_deref (false) call `#dup` before returning the data
34-
# @option opts [Boolean] :freeze_on_deref (false) call `#freeze` before returning the data
35-
# @option opts [Proc] :copy_on_deref (nil) call the given `Proc` passing
36-
# the internal value and returning the value returned from the proc
25+
# @!macro executor_and_deref_options
3726
def initialize(initial, opts = {})
3827
@value = initial
3928
@rescuers = []

lib/concurrent/async.rb

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,11 @@ def method_missing(method, *args, &block)
8282
self.define_singleton_method(method) do |*args2|
8383
Async::validate_argc(@delegate, method, *args2)
8484
ivar = Concurrent::IVar.new
85-
value, reason = nil, nil
8685
@serializer.post(@executor.value) do
8786
begin
88-
value = @delegate.send(method, *args2, &block)
87+
ivar.set(@delegate.send(method, *args2, &block))
8988
rescue => reason
90-
# caught
91-
ensure
92-
ivar.complete(reason.nil?, value, reason)
89+
ivar.fail(reason)
9390
end
9491
end
9592
ivar.value if @blocking

lib/concurrent/atomic.rb

Lines changed: 0 additions & 93 deletions
This file was deleted.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
require 'concurrent/native_extensions'
2+
require 'concurrent/utility/engine'
3+
require 'concurrent/atomic_reference/concurrent_update_error'
4+
require 'concurrent/atomic_reference/mutex_atomic'
5+
6+
begin
7+
# force fallback impl with FORCE_ATOMIC_FALLBACK=1
8+
if /[^0fF]/ =~ ENV['FORCE_ATOMIC_FALLBACK']
9+
ruby_engine = 'mutex_atomic'
10+
else
11+
ruby_engine = Concurrent.ruby_engine
12+
end
13+
14+
require "concurrent/atomic_reference/#{ruby_engine}"
15+
rescue LoadError
16+
#warn 'Compiled extensions not installed, pure Ruby Atomic will be used.'
17+
end
18+
19+
if defined? Concurrent::JavaAtomicReference
20+
21+
# @!macro atomic_reference
22+
class Concurrent::AtomicReference < Concurrent::JavaAtomicReference
23+
end
24+
25+
elsif defined? Concurrent::RbxAtomicReference
26+
27+
# @!macro atomic_reference
28+
class Concurrent::AtomicReference < Concurrent::RbxAtomicReference
29+
end
30+
31+
elsif defined? Concurrent::CAtomicReference
32+
33+
# @!macro atomic_reference
34+
class Concurrent::AtomicReference < Concurrent::CAtomicReference
35+
end
36+
37+
else
38+
39+
# @!macro atomic_reference
40+
class Concurrent::AtomicReference < Concurrent::MutexAtomicReference
41+
end
42+
end
43+
44+
module Concurrent
45+
46+
# @see Concurrent::AtomicReference
47+
# @deprecated Use Concurrent::AtomicReference instead.
48+
Atomic = AtomicReference
49+
end

lib/concurrent/atomic/copy_on_notify_observer_set.rb

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,40 +33,38 @@ def add_observer(observer=nil, func=:update, &block)
3333
begin
3434
@mutex.lock
3535
@observers[observer] = func
36+
observer
3637
ensure
3738
@mutex.unlock
3839
end
39-
40-
observer
4140
end
4241

4342
# @param [Object] observer the observer to remove
4443
# @return [Object] the deleted observer
4544
def delete_observer(observer)
4645
@mutex.lock
4746
@observers.delete(observer)
48-
@mutex.unlock
49-
5047
observer
48+
ensure
49+
@mutex.unlock
5150
end
5251

5352
# Deletes all observers
5453
# @return [CopyOnWriteObserverSet] self
5554
def delete_observers
5655
@mutex.lock
5756
@observers.clear
58-
@mutex.unlock
59-
6057
self
58+
ensure
59+
@mutex.unlock
6160
end
6261

6362
# @return [Integer] the observers count
6463
def count_observers
6564
@mutex.lock
66-
result = @observers.count
65+
@observers.count
66+
ensure
6767
@mutex.unlock
68-
69-
result
7068
end
7169

7270
# Notifies all registered observers with optional args
@@ -75,7 +73,6 @@ def count_observers
7573
def notify_observers(*args, &block)
7674
observers = duplicate_observers
7775
notify_to(observers, *args, &block)
78-
7976
self
8077
end
8178

@@ -86,7 +83,6 @@ def notify_observers(*args, &block)
8683
def notify_and_delete_observers(*args, &block)
8784
observers = duplicate_and_clear_observers
8885
notify_to(observers, *args, &block)
89-
9086
self
9187
end
9288

@@ -96,17 +92,17 @@ def duplicate_and_clear_observers
9692
@mutex.lock
9793
observers = @observers.dup
9894
@observers.clear
99-
@mutex.unlock
100-
10195
observers
96+
ensure
97+
@mutex.unlock
10298
end
10399

104100
def duplicate_observers
105101
@mutex.lock
106102
observers = @observers.dup
107-
@mutex.unlock
108-
109103
observers
104+
ensure
105+
@mutex.unlock
110106
end
111107

112108
def notify_to(observers, *args)

lib/concurrent/atomic/read_write_lock.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
require 'thread'
2-
require 'concurrent/atomic'
2+
require 'concurrent/atomic/atomic_reference'
33
require 'concurrent/errors'
44

55
module Concurrent
@@ -53,11 +53,11 @@ class ReadWriteLock
5353

5454
# Create a new `ReadWriteLock` in the unlocked state.
5555
def initialize
56-
@counter = Atomic.new(0) # single integer which represents lock state
57-
@reader_q = ConditionVariable.new # queue for waiting readers
58-
@reader_mutex = Mutex.new # to protect reader queue
59-
@writer_q = ConditionVariable.new # queue for waiting writers
60-
@writer_mutex = Mutex.new # to protect writer queue
56+
@counter = AtomicReference.new(0) # single integer which represents lock state
57+
@reader_q = ConditionVariable.new # queue for waiting readers
58+
@reader_mutex = Mutex.new # to protect reader queue
59+
@writer_q = ConditionVariable.new # queue for waiting writers
60+
@writer_mutex = Mutex.new # to protect writer queue
6161
end
6262

6363
# Execute a block operation within a read lock.

0 commit comments

Comments
 (0)