concurrent-ruby 0.6.0 → 0.7.0.rc0
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 +4 -4
- data/README.md +55 -51
- data/lib/concurrent/actress/ad_hoc.rb +6 -0
- data/lib/concurrent/actress/context.rb +10 -8
- data/lib/concurrent/actress/core.rb +44 -20
- data/lib/concurrent/actress/core_delegations.rb +5 -0
- data/lib/concurrent/actress/envelope.rb +21 -5
- data/lib/concurrent/actress/reference.rb +5 -5
- data/lib/concurrent/actress.rb +152 -6
- data/lib/concurrent/agent.rb +9 -9
- data/lib/concurrent/atomic.rb +46 -0
- data/lib/concurrent/atomic_reference/concurrent_update_error.rb +7 -0
- data/lib/concurrent/atomic_reference/delegated_update.rb +28 -0
- data/lib/concurrent/atomic_reference/direct_update.rb +28 -0
- data/lib/concurrent/atomic_reference/jruby.rb +8 -0
- data/lib/concurrent/atomic_reference/mutex_atomic.rb +47 -0
- data/lib/concurrent/atomic_reference/numeric_cas_wrapper.rb +24 -0
- data/lib/concurrent/atomic_reference/rbx.rb +16 -0
- data/lib/concurrent/atomic_reference/ruby.rb +16 -0
- data/lib/concurrent/atomics.rb +1 -1
- data/lib/concurrent/configuration.rb +7 -2
- data/lib/concurrent/executor/ruby_thread_pool_executor.rb +0 -1
- data/lib/concurrent/executor/{one_by_one.rb → serialized_execution.rb} +21 -8
- data/lib/concurrent/executor/timer_set.rb +6 -1
- data/lib/concurrent/executors.rb +1 -1
- data/lib/concurrent/logging.rb +1 -1
- data/lib/concurrent/observable.rb +1 -1
- data/lib/concurrent/supervisor.rb +1 -1
- data/lib/concurrent/timer_task.rb +0 -36
- data/lib/concurrent/version.rb +1 -1
- data/lib/concurrent.rb +3 -4
- data/lib/concurrent_ruby_ext.so +0 -0
- data/lib/extension_helper.rb +9 -0
- metadata +19 -152
- data/lib/concurrent/actor/actor.rb +0 -270
- data/lib/concurrent/actor/postable.rb +0 -102
- data/lib/concurrent/actors.rb +0 -2
- data/lib/concurrent/actress/doc.md +0 -53
- data/lib/concurrent/atomic/atomic.rb +0 -48
- data/lib/concurrent/runnable.rb +0 -90
- data/lib/concurrent/stoppable.rb +0 -20
- data/spec/concurrent/actor/actor_spec.rb +0 -376
- data/spec/concurrent/actor/postable_shared.rb +0 -218
- data/spec/concurrent/actress_spec.rb +0 -191
- data/spec/concurrent/agent_spec.rb +0 -500
- data/spec/concurrent/async_spec.rb +0 -352
- data/spec/concurrent/atomic/atomic_boolean_spec.rb +0 -172
- data/spec/concurrent/atomic/atomic_fixnum_spec.rb +0 -186
- data/spec/concurrent/atomic/atomic_spec.rb +0 -133
- data/spec/concurrent/atomic/condition_spec.rb +0 -171
- data/spec/concurrent/atomic/copy_on_notify_observer_set_spec.rb +0 -10
- data/spec/concurrent/atomic/copy_on_write_observer_set_spec.rb +0 -10
- data/spec/concurrent/atomic/count_down_latch_spec.rb +0 -151
- data/spec/concurrent/atomic/cyclic_barrier_spec.rb +0 -248
- data/spec/concurrent/atomic/event_spec.rb +0 -200
- data/spec/concurrent/atomic/observer_set_shared.rb +0 -242
- data/spec/concurrent/atomic/thread_local_var_spec.rb +0 -113
- data/spec/concurrent/channel/buffered_channel_spec.rb +0 -151
- data/spec/concurrent/channel/channel_spec.rb +0 -39
- data/spec/concurrent/channel/probe_spec.rb +0 -77
- data/spec/concurrent/channel/unbuffered_channel_spec.rb +0 -132
- data/spec/concurrent/collection/blocking_ring_buffer_spec.rb +0 -149
- data/spec/concurrent/collection/priority_queue_spec.rb +0 -317
- data/spec/concurrent/collection/ring_buffer_spec.rb +0 -126
- data/spec/concurrent/configuration_spec.rb +0 -71
- data/spec/concurrent/dataflow_spec.rb +0 -242
- data/spec/concurrent/delay_spec.rb +0 -91
- data/spec/concurrent/dereferenceable_shared.rb +0 -146
- data/spec/concurrent/exchanger_spec.rb +0 -66
- data/spec/concurrent/executor/cached_thread_pool_shared.rb +0 -115
- data/spec/concurrent/executor/fixed_thread_pool_shared.rb +0 -136
- data/spec/concurrent/executor/global_thread_pool_shared.rb +0 -35
- data/spec/concurrent/executor/immediate_executor_spec.rb +0 -12
- data/spec/concurrent/executor/java_cached_thread_pool_spec.rb +0 -44
- data/spec/concurrent/executor/java_fixed_thread_pool_spec.rb +0 -64
- data/spec/concurrent/executor/java_single_thread_executor_spec.rb +0 -21
- data/spec/concurrent/executor/java_thread_pool_executor_spec.rb +0 -71
- data/spec/concurrent/executor/per_thread_executor_spec.rb +0 -57
- data/spec/concurrent/executor/ruby_cached_thread_pool_spec.rb +0 -69
- data/spec/concurrent/executor/ruby_fixed_thread_pool_spec.rb +0 -39
- data/spec/concurrent/executor/ruby_single_thread_executor_spec.rb +0 -18
- data/spec/concurrent/executor/ruby_thread_pool_executor_spec.rb +0 -171
- data/spec/concurrent/executor/safe_task_executor_spec.rb +0 -103
- data/spec/concurrent/executor/thread_pool_class_cast_spec.rb +0 -52
- data/spec/concurrent/executor/thread_pool_executor_shared.rb +0 -155
- data/spec/concurrent/executor/thread_pool_shared.rb +0 -239
- data/spec/concurrent/executor/timer_set_spec.rb +0 -183
- data/spec/concurrent/future_spec.rb +0 -329
- data/spec/concurrent/ivar_spec.rb +0 -215
- data/spec/concurrent/mvar_spec.rb +0 -380
- data/spec/concurrent/obligation_shared.rb +0 -102
- data/spec/concurrent/obligation_spec.rb +0 -282
- data/spec/concurrent/observable_shared.rb +0 -177
- data/spec/concurrent/observable_spec.rb +0 -56
- data/spec/concurrent/options_parser_spec.rb +0 -71
- data/spec/concurrent/promise_spec.rb +0 -367
- data/spec/concurrent/runnable_shared.rb +0 -68
- data/spec/concurrent/runnable_spec.rb +0 -235
- data/spec/concurrent/scheduled_task_spec.rb +0 -342
- data/spec/concurrent/stoppable_shared.rb +0 -37
- data/spec/concurrent/supervisor_spec.rb +0 -1148
- data/spec/concurrent/timer_task_spec.rb +0 -258
- data/spec/concurrent/tvar_spec.rb +0 -137
- data/spec/concurrent/utility/processor_count_spec.rb +0 -20
- data/spec/concurrent/utility/timeout_spec.rb +0 -50
- data/spec/concurrent/utility/timer_spec.rb +0 -52
- data/spec/spec_helper.rb +0 -31
- data/spec/support/example_group_extensions.rb +0 -48
- data/spec/support/less_than_or_equal_to_matcher.rb +0 -5
- /data/{LICENSE → LICENSE.txt} +0 -0
data/lib/concurrent/agent.rb
CHANGED
|
@@ -62,14 +62,14 @@ module Concurrent
|
|
|
62
62
|
# @option opts [String] :copy_on_deref (nil) call the given `Proc` passing the internal value and
|
|
63
63
|
# returning the value returned from the proc
|
|
64
64
|
def initialize(initial, opts = {})
|
|
65
|
-
@value
|
|
66
|
-
@rescuers
|
|
67
|
-
@validator
|
|
68
|
-
@timeout
|
|
69
|
-
self.observers
|
|
70
|
-
@
|
|
71
|
-
@task_executor
|
|
72
|
-
@operation_executor
|
|
65
|
+
@value = initial
|
|
66
|
+
@rescuers = []
|
|
67
|
+
@validator = Proc.new { |result| true }
|
|
68
|
+
@timeout = opts.fetch(:timeout, TIMEOUT).freeze
|
|
69
|
+
self.observers = CopyOnWriteObserverSet.new
|
|
70
|
+
@serialized_execution = SerializedExecution.new
|
|
71
|
+
@task_executor = OptionsParser.get_task_executor_from(opts)
|
|
72
|
+
@operation_executor = OptionsParser.get_operation_executor_from(opts)
|
|
73
73
|
init_mutex
|
|
74
74
|
set_deref_options(opts)
|
|
75
75
|
end
|
|
@@ -180,7 +180,7 @@ module Concurrent
|
|
|
180
180
|
|
|
181
181
|
def post_on(executor, &block)
|
|
182
182
|
return nil if block.nil?
|
|
183
|
-
@
|
|
183
|
+
@serialized_execution.post(executor) { work(&block) }
|
|
184
184
|
true
|
|
185
185
|
end
|
|
186
186
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'concurrent/atomic_reference/concurrent_update_error'
|
|
2
|
+
require 'concurrent/atomic_reference/mutex_atomic'
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
# force fallback impl with FORCE_ATOMIC_FALLBACK=1
|
|
6
|
+
if /[^0fF]/ =~ ENV['FORCE_ATOMIC_FALLBACK']
|
|
7
|
+
ruby_engine = 'mutex_atomic'
|
|
8
|
+
else
|
|
9
|
+
ruby_engine = defined?(RUBY_ENGINE)? RUBY_ENGINE : 'ruby'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
require "concurrent/atomic_reference/#{ruby_engine}"
|
|
13
|
+
rescue LoadError
|
|
14
|
+
warn 'Compiled extensions not installed, pure Ruby Atomic will be used.'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if defined? Concurrent::JavaAtomic
|
|
18
|
+
|
|
19
|
+
class Concurrent::Atomic < Concurrent::JavaAtomic
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
elsif defined? Concurrent::CAtomic
|
|
23
|
+
|
|
24
|
+
class Concurrent::Atomic < Concurrent::CAtomic
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
elsif defined? Concurrent::RbxAtomic
|
|
28
|
+
|
|
29
|
+
class Concurrent::Atomic < Concurrent::RbxAtomic
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
else
|
|
33
|
+
|
|
34
|
+
class Concurrent::Atomic < Concurrent::MutexAtomic
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
class Atomic < Concurrent::Atomic
|
|
39
|
+
|
|
40
|
+
ConcurrentUpdateError = Class.new(Concurrent::ConcurrentUpdateError)
|
|
41
|
+
|
|
42
|
+
def initialize(*args)
|
|
43
|
+
warn "[DEPRECATED] Please use Concurrent::Atomic instead."
|
|
44
|
+
super
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'concurrent/atomic_reference/concurrent_update_error'
|
|
2
|
+
|
|
3
|
+
module Concurrent
|
|
4
|
+
|
|
5
|
+
# Define update methods that delegate to @ref field
|
|
6
|
+
class Atomic
|
|
7
|
+
# Pass the current value to the given block, replacing it
|
|
8
|
+
# with the block's result. May retry if the value changes
|
|
9
|
+
# during the block's execution.
|
|
10
|
+
def update
|
|
11
|
+
true until @ref.compare_and_set(old_value = @ref.get, new_value = yield(old_value))
|
|
12
|
+
new_value
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def try_update
|
|
16
|
+
old_value = @ref.get
|
|
17
|
+
new_value = yield old_value
|
|
18
|
+
unless @ref.compare_and_set(old_value, new_value)
|
|
19
|
+
if $VERBOSE
|
|
20
|
+
raise ConcurrentUpdateError, "Update failed"
|
|
21
|
+
else
|
|
22
|
+
raise ConcurrentUpdateError, "Update failed", ConcurrentUpdateError::CONC_UP_ERR_BACKTRACE
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
new_value
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'concurrent/atomic_reference/concurrent_update_error'
|
|
2
|
+
|
|
3
|
+
module Concurrent
|
|
4
|
+
|
|
5
|
+
# Define update methods that use direct paths
|
|
6
|
+
module AtomicDirectUpdate
|
|
7
|
+
# Pass the current value to the given block, replacing it
|
|
8
|
+
# with the block's result. May retry if the value changes
|
|
9
|
+
# during the block's execution.
|
|
10
|
+
def update
|
|
11
|
+
true until compare_and_set(old_value = get, new_value = yield(old_value))
|
|
12
|
+
new_value
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def try_update
|
|
16
|
+
old_value = get
|
|
17
|
+
new_value = yield old_value
|
|
18
|
+
unless compare_and_set(old_value, new_value)
|
|
19
|
+
if $VERBOSE
|
|
20
|
+
raise ConcurrentUpdateError, "Update failed"
|
|
21
|
+
else
|
|
22
|
+
raise ConcurrentUpdateError, "Update failed", ConcurrentUpdateError::CONC_UP_ERR_BACKTRACE
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
new_value
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
require 'concurrent/atomic_reference/direct_update'
|
|
3
|
+
require 'concurrent/atomic_reference/numeric_cas_wrapper'
|
|
4
|
+
|
|
5
|
+
module Concurrent
|
|
6
|
+
|
|
7
|
+
# Portable/generic (but not very memory or scheduling-efficient) fallback
|
|
8
|
+
class MutexAtomic #:nodoc: all
|
|
9
|
+
include Concurrent::AtomicDirectUpdate
|
|
10
|
+
include Concurrent::AtomicNumericCompareAndSetWrapper
|
|
11
|
+
|
|
12
|
+
def initialize(value = nil)
|
|
13
|
+
@mutex = Mutex.new
|
|
14
|
+
@value = value
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def get
|
|
18
|
+
@mutex.synchronize { @value }
|
|
19
|
+
end
|
|
20
|
+
alias value get
|
|
21
|
+
|
|
22
|
+
def set(new_value)
|
|
23
|
+
@mutex.synchronize { @value = new_value }
|
|
24
|
+
end
|
|
25
|
+
alias value= set
|
|
26
|
+
|
|
27
|
+
def get_and_set(new_value)
|
|
28
|
+
@mutex.synchronize do
|
|
29
|
+
old_value = @value
|
|
30
|
+
@value = new_value
|
|
31
|
+
old_value
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
alias swap get_and_set
|
|
35
|
+
|
|
36
|
+
def _compare_and_set(old_value, new_value)
|
|
37
|
+
return false unless @mutex.try_lock
|
|
38
|
+
begin
|
|
39
|
+
return false unless @value.equal? old_value
|
|
40
|
+
@value = new_value
|
|
41
|
+
ensure
|
|
42
|
+
@mutex.unlock
|
|
43
|
+
end
|
|
44
|
+
true
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Concurrent
|
|
2
|
+
|
|
3
|
+
module AtomicNumericCompareAndSetWrapper
|
|
4
|
+
#alias _compare_and_set compare_and_set
|
|
5
|
+
|
|
6
|
+
def compare_and_set(expected, new)
|
|
7
|
+
if expected.kind_of? Numeric
|
|
8
|
+
while true
|
|
9
|
+
old = get
|
|
10
|
+
|
|
11
|
+
return false unless old.kind_of? Numeric
|
|
12
|
+
|
|
13
|
+
return false unless old == expected
|
|
14
|
+
|
|
15
|
+
result = _compare_and_set(old, new)
|
|
16
|
+
return result if result
|
|
17
|
+
end
|
|
18
|
+
else
|
|
19
|
+
_compare_and_set(expected, new)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
alias compare_and_swap compare_and_set
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'concurrent/atomic_reference/direct_update'
|
|
2
|
+
require 'concurrent/atomic_reference/numeric_cas_wrapper'
|
|
3
|
+
|
|
4
|
+
module Concurrent
|
|
5
|
+
|
|
6
|
+
# extend Rubinius's version adding aliases and numeric logic
|
|
7
|
+
class RbxAtomic < Rubinius::AtomicReference
|
|
8
|
+
alias _compare_and_set compare_and_set
|
|
9
|
+
include Concurrent::AtomicDirectUpdate
|
|
10
|
+
include Concurrent::AtomicNumericCompareAndSetWrapper
|
|
11
|
+
|
|
12
|
+
alias value get
|
|
13
|
+
alias value= set
|
|
14
|
+
alias swap get_and_set
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
begin
|
|
2
|
+
require 'concurrent_ruby_ext'
|
|
3
|
+
rescue LoadError
|
|
4
|
+
# may be a Windows cross-compiled native gem
|
|
5
|
+
require "#{RUBY_VERSION[0..2]}/concurrent_ruby_ext"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
require 'concurrent/atomic_reference/direct_update'
|
|
9
|
+
require 'concurrent/atomic_reference/numeric_cas_wrapper'
|
|
10
|
+
|
|
11
|
+
module Concurrent
|
|
12
|
+
class CAtomic
|
|
13
|
+
include Concurrent::AtomicDirectUpdate
|
|
14
|
+
include Concurrent::AtomicNumericCompareAndSetWrapper
|
|
15
|
+
end
|
|
16
|
+
end
|
data/lib/concurrent/atomics.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'thread'
|
|
2
2
|
require 'concurrent/delay'
|
|
3
3
|
require 'concurrent/errors'
|
|
4
|
+
require 'concurrent/atomic'
|
|
4
5
|
require 'concurrent/executor/thread_pool_executor'
|
|
5
6
|
require 'concurrent/executor/timer_set'
|
|
6
7
|
require 'concurrent/utility/processor_count'
|
|
@@ -111,8 +112,12 @@ module Concurrent
|
|
|
111
112
|
end
|
|
112
113
|
|
|
113
114
|
# create the default configuration on load
|
|
114
|
-
@configuration = Configuration.new
|
|
115
|
-
|
|
115
|
+
@configuration = Atomic.new Configuration.new
|
|
116
|
+
|
|
117
|
+
# @return [Configuration]
|
|
118
|
+
def self.configuration
|
|
119
|
+
@configuration.value
|
|
120
|
+
end
|
|
116
121
|
|
|
117
122
|
# Perform gem-level configuration.
|
|
118
123
|
#
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
require 'concurrent/logging'
|
|
2
|
+
|
|
1
3
|
module Concurrent
|
|
2
4
|
|
|
3
|
-
# Ensures
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
# Ensures passed jobs in a serialized order never running at the same time.
|
|
6
|
+
class SerializedExecution
|
|
7
|
+
include Logging
|
|
6
8
|
|
|
7
9
|
Job = Struct.new(:executor, :args, :block) do
|
|
8
10
|
def call
|
|
@@ -30,10 +32,6 @@ module Concurrent
|
|
|
30
32
|
# @raise [ArgumentError] if no task is given
|
|
31
33
|
def post(executor, *args, &task)
|
|
32
34
|
return nil if task.nil?
|
|
33
|
-
# FIXME Agent#send-off will blow up here
|
|
34
|
-
# if executor.can_overflow?
|
|
35
|
-
# raise ArgumentError, 'OneByOne cannot be used in conjunction with executor which may overflow'
|
|
36
|
-
# end
|
|
37
35
|
|
|
38
36
|
job = Job.new executor, args, task
|
|
39
37
|
|
|
@@ -56,7 +54,22 @@ module Concurrent
|
|
|
56
54
|
private
|
|
57
55
|
|
|
58
56
|
def call_job(job)
|
|
59
|
-
|
|
57
|
+
did_it_run = begin
|
|
58
|
+
job.executor.post { work(job) }
|
|
59
|
+
true
|
|
60
|
+
rescue RejectedExecutionError => ex
|
|
61
|
+
false
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# TODO not the best idea to run it myself
|
|
65
|
+
unless did_it_run
|
|
66
|
+
begin
|
|
67
|
+
work job
|
|
68
|
+
rescue => ex
|
|
69
|
+
# let it fail
|
|
70
|
+
log DEBUG, ex
|
|
71
|
+
end
|
|
72
|
+
end
|
|
60
73
|
end
|
|
61
74
|
|
|
62
75
|
# ensures next job is executed if any is stashed
|
|
@@ -61,7 +61,12 @@ module Concurrent
|
|
|
61
61
|
|
|
62
62
|
end
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
# For a timer, #kill is like an orderly shutdown, except we need to manually
|
|
65
|
+
# (and destructively) clear the queue first
|
|
66
|
+
def kill
|
|
67
|
+
@queue.clear
|
|
68
|
+
shutdown
|
|
69
|
+
end
|
|
65
70
|
|
|
66
71
|
# Calculate an Epoch time with milliseconds at which to execute a
|
|
67
72
|
# task. If the given time is a `Time` object it will be converted
|
data/lib/concurrent/executors.rb
CHANGED
|
@@ -6,4 +6,4 @@ require 'concurrent/executor/safe_task_executor'
|
|
|
6
6
|
require 'concurrent/executor/single_thread_executor'
|
|
7
7
|
require 'concurrent/executor/thread_pool_executor'
|
|
8
8
|
require 'concurrent/executor/timer_set'
|
|
9
|
-
require 'concurrent/executor/
|
|
9
|
+
require 'concurrent/executor/serialized_execution'
|
data/lib/concurrent/logging.rb
CHANGED
|
@@ -9,7 +9,7 @@ module Concurrent
|
|
|
9
9
|
# @param [Integer] level one of Logger::Severity constants
|
|
10
10
|
# @param [String] progname e.g. a path of an Actor
|
|
11
11
|
# @param [String, nil] message when nil block is used to generate the message
|
|
12
|
-
# @
|
|
12
|
+
# @yieldreturn [String] a message
|
|
13
13
|
def log(level, progname, message = nil, &block)
|
|
14
14
|
(@logger || Concurrent.configuration.logger).call level, progname, message, &block
|
|
15
15
|
end
|
|
@@ -10,7 +10,7 @@ module Concurrent
|
|
|
10
10
|
observers.add_observer(*args, &block)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
# as #add_observer but it can be used for
|
|
13
|
+
# as #add_observer but it can be used for chaining
|
|
14
14
|
# @return [Observable] self
|
|
15
15
|
def with_observer(*args, &block)
|
|
16
16
|
add_observer *args, &block
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require 'thread'
|
|
2
2
|
|
|
3
3
|
require 'concurrent/errors'
|
|
4
|
-
require 'concurrent/runnable'
|
|
5
4
|
|
|
6
5
|
module Concurrent
|
|
7
6
|
|
|
@@ -61,6 +60,7 @@ module Concurrent
|
|
|
61
60
|
alias_method :max_t, :max_time
|
|
62
61
|
|
|
63
62
|
def initialize(opts = {})
|
|
63
|
+
warn '[EXPERIMENTAL] Supervisor is being completely rewritten and will change soon.'
|
|
64
64
|
@restart_strategy = opts[:restart_strategy] || opts[:strategy] || :one_for_one
|
|
65
65
|
@monitor_interval = (opts[:monitor_interval] || DEFAULT_MONITOR_INTERVAL).to_f
|
|
66
66
|
@max_restart = (opts[:max_restart] || opts[:max_r] || DEFAULT_MAX_RESTART).to_i
|
|
@@ -4,9 +4,6 @@ require 'concurrent/atomic/atomic_boolean'
|
|
|
4
4
|
require 'concurrent/executor/executor'
|
|
5
5
|
require 'concurrent/executor/safe_task_executor'
|
|
6
6
|
|
|
7
|
-
# deprecated Updated to use `Executor` instead of `Runnable`
|
|
8
|
-
require 'concurrent/runnable'
|
|
9
|
-
|
|
10
7
|
module Concurrent
|
|
11
8
|
|
|
12
9
|
# A very common currency pattern is to run a thread that performs a task at regular
|
|
@@ -295,32 +292,6 @@ module Concurrent
|
|
|
295
292
|
end
|
|
296
293
|
end
|
|
297
294
|
|
|
298
|
-
# @deprecated Updated to use `Executor` instead of `Runnable`
|
|
299
|
-
def terminate(*args) deprecated(:terminate, :kill, *args); end
|
|
300
|
-
|
|
301
|
-
# @deprecated Updated to use `Executor` instead of `Runnable`
|
|
302
|
-
def stop(*args) deprecated(:stop, :shutdown, *args); end
|
|
303
|
-
|
|
304
|
-
# @deprecated Updated to use `Executor` instead of `Runnable`
|
|
305
|
-
def cancel(*args) deprecated(:cancel, :shutdown, *args); end
|
|
306
|
-
|
|
307
|
-
# @deprecated Updated to use `Executor` instead of `Runnable`
|
|
308
|
-
def run!(*args) deprecated(:run!, :execute); end
|
|
309
|
-
|
|
310
|
-
# @deprecated Updated to use `Executor` instead of `Runnable`
|
|
311
|
-
def self.run!(*args, &block)
|
|
312
|
-
warn "[DEPRECATED] `run!` is deprecated, please use `execute` instead."
|
|
313
|
-
Concurrent::Runnable::Context.new(TimerTask.new(*args, &block))
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
# @deprecated Updated to use `Executor` instead of `Runnable`
|
|
317
|
-
def run
|
|
318
|
-
raise Concurrent::Runnable::LifecycleError.new('already running') if @running.true?
|
|
319
|
-
self.execute
|
|
320
|
-
self.wait_for_termination
|
|
321
|
-
true
|
|
322
|
-
end
|
|
323
|
-
|
|
324
295
|
private :post, :<<
|
|
325
296
|
|
|
326
297
|
protected
|
|
@@ -366,12 +337,5 @@ module Concurrent
|
|
|
366
337
|
observers.notify_observers(Time.now, nil, Concurrent::TimeoutError.new)
|
|
367
338
|
end
|
|
368
339
|
end
|
|
369
|
-
|
|
370
|
-
# @deprecated Updated to use `Executor` instead of `Runnable`
|
|
371
|
-
# @!visibility private
|
|
372
|
-
def deprecated(old, new, *args)
|
|
373
|
-
warn "[DEPRECATED] `#{old}` is deprecated, please use `#{new}` instead."
|
|
374
|
-
self.send(new, *args)
|
|
375
|
-
end
|
|
376
340
|
end
|
|
377
341
|
end
|
data/lib/concurrent/version.rb
CHANGED
data/lib/concurrent.rb
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
require 'concurrent/version'
|
|
2
|
+
|
|
2
3
|
require 'concurrent/configuration'
|
|
3
4
|
|
|
4
5
|
require 'concurrent/atomics'
|
|
5
|
-
require 'concurrent/actors'
|
|
6
6
|
require 'concurrent/channels'
|
|
7
7
|
require 'concurrent/collections'
|
|
8
8
|
require 'concurrent/executors'
|
|
9
9
|
require 'concurrent/utilities'
|
|
10
10
|
|
|
11
|
+
require 'concurrent/actress'
|
|
12
|
+
require 'concurrent/atomic'
|
|
11
13
|
require 'concurrent/agent'
|
|
12
14
|
require 'concurrent/async'
|
|
13
15
|
require 'concurrent/dataflow'
|
|
@@ -22,13 +24,10 @@ require 'concurrent/obligation'
|
|
|
22
24
|
require 'concurrent/observable'
|
|
23
25
|
require 'concurrent/options_parser'
|
|
24
26
|
require 'concurrent/promise'
|
|
25
|
-
require 'concurrent/runnable'
|
|
26
27
|
require 'concurrent/scheduled_task'
|
|
27
|
-
require 'concurrent/stoppable'
|
|
28
28
|
require 'concurrent/supervisor'
|
|
29
29
|
require 'concurrent/timer_task'
|
|
30
30
|
require 'concurrent/tvar'
|
|
31
|
-
require 'concurrent/actress'
|
|
32
31
|
|
|
33
32
|
# Modern concurrency tools for Ruby. Inspired by Erlang, Clojure, Scala, Haskell,
|
|
34
33
|
# F#, C#, Java, and classic concurrency patterns.
|
|
Binary file
|