concurrent-ruby 1.0.5 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +65 -0
- data/Gemfile +39 -0
- data/{LICENSE.txt → LICENSE.md} +2 -0
- data/README.md +207 -105
- data/Rakefile +314 -0
- data/ext/concurrent-ruby/ConcurrentRubyService.java +17 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/AtomicReferenceLibrary.java +175 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/JRubyMapBackendLibrary.java +248 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicBooleanLibrary.java +93 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicFixnumLibrary.java +113 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaSemaphoreLibrary.java +159 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java +306 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMap.java +31 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMapV8.java +3863 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/LongAdder.java +203 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/Striped64.java +342 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/ConcurrentHashMapV8.java +3800 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/LongAdder.java +204 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/Striped64.java +291 -0
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166y/ThreadLocalRandom.java +199 -0
- data/lib/concurrent/agent.rb +7 -7
- data/lib/concurrent/array.rb +59 -32
- data/lib/concurrent/async.rb +4 -4
- data/lib/concurrent/atom.rb +9 -9
- data/lib/concurrent/atomic/atomic_boolean.rb +24 -20
- data/lib/concurrent/atomic/atomic_fixnum.rb +27 -23
- data/lib/concurrent/atomic/atomic_markable_reference.rb +164 -0
- data/lib/concurrent/atomic/atomic_reference.rb +185 -32
- data/lib/concurrent/atomic/count_down_latch.rb +6 -6
- data/lib/concurrent/atomic/cyclic_barrier.rb +1 -1
- data/lib/concurrent/atomic/event.rb +1 -1
- data/lib/concurrent/atomic/java_count_down_latch.rb +9 -6
- data/lib/concurrent/atomic/mutex_atomic_boolean.rb +2 -0
- data/lib/concurrent/atomic/mutex_count_down_latch.rb +1 -0
- data/lib/concurrent/atomic/read_write_lock.rb +2 -1
- data/lib/concurrent/atomic/reentrant_read_write_lock.rb +3 -1
- data/lib/concurrent/atomic/semaphore.rb +8 -8
- data/lib/concurrent/atomic/thread_local_var.rb +7 -7
- data/lib/concurrent/atomic_reference/mutex_atomic.rb +3 -8
- data/lib/concurrent/atomic_reference/numeric_cas_wrapper.rb +1 -1
- data/lib/concurrent/atomics.rb +0 -43
- data/lib/concurrent/collection/lock_free_stack.rb +158 -0
- data/lib/concurrent/collection/map/atomic_reference_map_backend.rb +3 -3
- data/lib/concurrent/collection/map/non_concurrent_map_backend.rb +1 -2
- data/lib/concurrent/collection/non_concurrent_priority_queue.rb +29 -29
- data/lib/concurrent/concern/dereferenceable.rb +1 -1
- data/lib/concurrent/concern/logging.rb +6 -1
- data/lib/concurrent/concern/observable.rb +7 -7
- data/lib/concurrent/concurrent_ruby.jar +0 -0
- data/lib/concurrent/configuration.rb +1 -6
- data/lib/concurrent/constants.rb +1 -1
- data/lib/concurrent/dataflow.rb +2 -1
- data/lib/concurrent/delay.rb +9 -7
- data/lib/concurrent/exchanger.rb +21 -25
- data/lib/concurrent/executor/abstract_executor_service.rb +2 -2
- data/lib/concurrent/executor/cached_thread_pool.rb +1 -1
- data/lib/concurrent/executor/executor_service.rb +15 -15
- data/lib/concurrent/executor/fixed_thread_pool.rb +18 -18
- data/lib/concurrent/executor/java_thread_pool_executor.rb +10 -7
- data/lib/concurrent/executor/single_thread_executor.rb +2 -2
- data/lib/concurrent/executor/thread_pool_executor.rb +6 -6
- data/lib/concurrent/executor/timer_set.rb +1 -1
- data/lib/concurrent/future.rb +4 -1
- data/lib/concurrent/hash.rb +53 -30
- data/lib/concurrent/ivar.rb +5 -6
- data/lib/concurrent/map.rb +178 -81
- data/lib/concurrent/maybe.rb +1 -1
- data/lib/concurrent/mutable_struct.rb +15 -14
- data/lib/concurrent/mvar.rb +2 -2
- data/lib/concurrent/promise.rb +53 -21
- data/lib/concurrent/promises.rb +1936 -0
- data/lib/concurrent/re_include.rb +58 -0
- data/lib/concurrent/set.rb +66 -0
- data/lib/concurrent/settable_struct.rb +1 -0
- data/lib/concurrent/synchronization/abstract_lockable_object.rb +5 -5
- data/lib/concurrent/synchronization/abstract_struct.rb +6 -4
- data/lib/concurrent/synchronization/lockable_object.rb +6 -6
- data/lib/concurrent/synchronization/{mri_lockable_object.rb → mutex_lockable_object.rb} +19 -14
- data/lib/concurrent/synchronization/object.rb +8 -4
- data/lib/concurrent/synchronization/truffleruby_object.rb +46 -0
- data/lib/concurrent/synchronization/volatile.rb +11 -9
- data/lib/concurrent/synchronization.rb +4 -5
- data/lib/concurrent/thread_safe/util/data_structures.rb +63 -0
- data/lib/concurrent/thread_safe/util/striped64.rb +9 -4
- data/lib/concurrent/timer_task.rb +5 -2
- data/lib/concurrent/tuple.rb +1 -1
- data/lib/concurrent/tvar.rb +2 -2
- data/lib/concurrent/utility/193.rb +17 -0
- data/lib/concurrent/utility/at_exit.rb +1 -1
- data/lib/concurrent/utility/engine.rb +4 -4
- data/lib/concurrent/utility/monotonic_time.rb +3 -3
- data/lib/concurrent/utility/native_extension_loader.rb +31 -33
- data/lib/concurrent/utility/processor_counter.rb +0 -2
- data/lib/concurrent/version.rb +2 -2
- data/lib/concurrent-ruby.rb +1 -0
- data/lib/concurrent.rb +26 -20
- metadata +33 -18
- data/lib/concurrent/atomic_reference/concurrent_update_error.rb +0 -8
- data/lib/concurrent/atomic_reference/direct_update.rb +0 -81
- data/lib/concurrent/atomic_reference/jruby+truffle.rb +0 -2
- data/lib/concurrent/atomic_reference/jruby.rb +0 -16
- data/lib/concurrent/atomic_reference/rbx.rb +0 -22
- data/lib/concurrent/atomic_reference/ruby.rb +0 -32
- data/lib/concurrent/edge.rb +0 -26
- data/lib/concurrent/lazy_register.rb +0 -81
- data/lib/concurrent/synchronization/truffle_lockable_object.rb +0 -9
- data/lib/concurrent/synchronization/truffle_object.rb +0 -31
- data/lib/concurrent/thread_safe/util/array_hash_rbx.rb +0 -30
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'concurrent/atomic/atomic_reference'
|
2
|
-
require 'concurrent/delay'
|
3
|
-
|
4
|
-
module Concurrent
|
5
|
-
|
6
|
-
# Hash-like collection that store lazys evaluated values.
|
7
|
-
#
|
8
|
-
# @example
|
9
|
-
# register = Concurrent::LazyRegister.new
|
10
|
-
# #=> #<Concurrent::LazyRegister:0x007fd7ecd5e230 @Data=#<Concurrent::AtomicReference:0x007fd7ecd5e1e0>>
|
11
|
-
# register[:key]
|
12
|
-
# #=> nil
|
13
|
-
# register.add(:key) { Concurrent::Actor.spawn!(Actor::AdHoc, :ping) { -> message { message } } }
|
14
|
-
# #=> #<Concurrent::LazyRegister:0x007fd7ecd5e230 @Data=#<Concurrent::AtomicReference:0x007fd7ecd5e1e0>>
|
15
|
-
# register[:key]
|
16
|
-
# #=> #<Concurrent::Actor::Reference /ping (Concurrent::Actor::AdHoc)>
|
17
|
-
#
|
18
|
-
# @!macro edge_warning
|
19
|
-
class LazyRegister < Synchronization::Object
|
20
|
-
|
21
|
-
private(*attr_atomic(:data))
|
22
|
-
|
23
|
-
def initialize
|
24
|
-
super
|
25
|
-
self.data = {}
|
26
|
-
end
|
27
|
-
|
28
|
-
# Element reference. Retrieves the value object corresponding to the
|
29
|
-
# key object. Returns nil if the key is not found. Raises an exception
|
30
|
-
# if the stored item raised an exception when the block was evaluated.
|
31
|
-
#
|
32
|
-
# @param [Object] key
|
33
|
-
# @return [Object] value stored for the key or nil if the key is not found
|
34
|
-
#
|
35
|
-
# @raise Exception when the initialization block fails
|
36
|
-
def [](key)
|
37
|
-
delay = data[key]
|
38
|
-
delay ? delay.value! : nil
|
39
|
-
end
|
40
|
-
|
41
|
-
# Returns true if the given key is present.
|
42
|
-
#
|
43
|
-
# @param [Object] key
|
44
|
-
# @return [true, false] if the key is registered
|
45
|
-
def registered?(key)
|
46
|
-
data.key?(key)
|
47
|
-
end
|
48
|
-
|
49
|
-
alias_method :key?, :registered?
|
50
|
-
alias_method :has_key?, :registered?
|
51
|
-
|
52
|
-
# Element assignment. Associates the value given by value with the
|
53
|
-
# key given by key.
|
54
|
-
#
|
55
|
-
# @param [Object] key
|
56
|
-
# @yield the object to store under the key
|
57
|
-
#
|
58
|
-
# @return [LazyRegister] self
|
59
|
-
def register(key, &block)
|
60
|
-
delay = Delay.new(executor: :immediate, &block)
|
61
|
-
update_data { |h| h.merge(key => delay) }
|
62
|
-
self
|
63
|
-
end
|
64
|
-
|
65
|
-
alias_method :add, :register
|
66
|
-
alias_method :store, :register
|
67
|
-
|
68
|
-
# Un-registers the object under key, realized or not.
|
69
|
-
#
|
70
|
-
# @param [Object] key
|
71
|
-
#
|
72
|
-
# @return [LazyRegister] self
|
73
|
-
def unregister(key)
|
74
|
-
update_data { |h| h.dup.tap { |j| j.delete(key) } }
|
75
|
-
self
|
76
|
-
end
|
77
|
-
|
78
|
-
alias_method :remove, :unregister
|
79
|
-
alias_method :delete, :unregister
|
80
|
-
end
|
81
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Concurrent
|
2
|
-
module Synchronization
|
3
|
-
|
4
|
-
module TruffleAttrVolatile
|
5
|
-
def self.included(base)
|
6
|
-
base.extend(ClassMethods)
|
7
|
-
end
|
8
|
-
|
9
|
-
module ClassMethods
|
10
|
-
def attr_volatile(*names)
|
11
|
-
# TODO may not always be available
|
12
|
-
attr_atomic(*names)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def full_memory_barrier
|
17
|
-
Truffle::System.full_memory_barrier
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
# @!visibility private
|
22
|
-
# @!macro internal_implementation_note
|
23
|
-
class TruffleObject < AbstractObject
|
24
|
-
include TruffleAttrVolatile
|
25
|
-
|
26
|
-
def initialize
|
27
|
-
# nothing to do
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'concurrent/thread_safe/util'
|
2
|
-
|
3
|
-
module Concurrent
|
4
|
-
module ThreadSafe
|
5
|
-
module Util
|
6
|
-
def self.make_synchronized_on_rbx(klass)
|
7
|
-
klass.class_eval do
|
8
|
-
private
|
9
|
-
def _mon_initialize
|
10
|
-
@_monitor = Monitor.new unless @_monitor # avoid double initialisation
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.allocate
|
14
|
-
obj = super
|
15
|
-
obj.send(:_mon_initialize)
|
16
|
-
obj
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
klass.superclass.instance_methods(false).each do |method|
|
21
|
-
klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
22
|
-
def #{method}(*args)
|
23
|
-
@_monitor.synchronize { super }
|
24
|
-
end
|
25
|
-
RUBY
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|