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.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +55 -51
  3. data/lib/concurrent/actress/ad_hoc.rb +6 -0
  4. data/lib/concurrent/actress/context.rb +10 -8
  5. data/lib/concurrent/actress/core.rb +44 -20
  6. data/lib/concurrent/actress/core_delegations.rb +5 -0
  7. data/lib/concurrent/actress/envelope.rb +21 -5
  8. data/lib/concurrent/actress/reference.rb +5 -5
  9. data/lib/concurrent/actress.rb +152 -6
  10. data/lib/concurrent/agent.rb +9 -9
  11. data/lib/concurrent/atomic.rb +46 -0
  12. data/lib/concurrent/atomic_reference/concurrent_update_error.rb +7 -0
  13. data/lib/concurrent/atomic_reference/delegated_update.rb +28 -0
  14. data/lib/concurrent/atomic_reference/direct_update.rb +28 -0
  15. data/lib/concurrent/atomic_reference/jruby.rb +8 -0
  16. data/lib/concurrent/atomic_reference/mutex_atomic.rb +47 -0
  17. data/lib/concurrent/atomic_reference/numeric_cas_wrapper.rb +24 -0
  18. data/lib/concurrent/atomic_reference/rbx.rb +16 -0
  19. data/lib/concurrent/atomic_reference/ruby.rb +16 -0
  20. data/lib/concurrent/atomics.rb +1 -1
  21. data/lib/concurrent/configuration.rb +7 -2
  22. data/lib/concurrent/executor/ruby_thread_pool_executor.rb +0 -1
  23. data/lib/concurrent/executor/{one_by_one.rb → serialized_execution.rb} +21 -8
  24. data/lib/concurrent/executor/timer_set.rb +6 -1
  25. data/lib/concurrent/executors.rb +1 -1
  26. data/lib/concurrent/logging.rb +1 -1
  27. data/lib/concurrent/observable.rb +1 -1
  28. data/lib/concurrent/supervisor.rb +1 -1
  29. data/lib/concurrent/timer_task.rb +0 -36
  30. data/lib/concurrent/version.rb +1 -1
  31. data/lib/concurrent.rb +3 -4
  32. data/lib/concurrent_ruby_ext.so +0 -0
  33. data/lib/extension_helper.rb +9 -0
  34. metadata +19 -152
  35. data/lib/concurrent/actor/actor.rb +0 -270
  36. data/lib/concurrent/actor/postable.rb +0 -102
  37. data/lib/concurrent/actors.rb +0 -2
  38. data/lib/concurrent/actress/doc.md +0 -53
  39. data/lib/concurrent/atomic/atomic.rb +0 -48
  40. data/lib/concurrent/runnable.rb +0 -90
  41. data/lib/concurrent/stoppable.rb +0 -20
  42. data/spec/concurrent/actor/actor_spec.rb +0 -376
  43. data/spec/concurrent/actor/postable_shared.rb +0 -218
  44. data/spec/concurrent/actress_spec.rb +0 -191
  45. data/spec/concurrent/agent_spec.rb +0 -500
  46. data/spec/concurrent/async_spec.rb +0 -352
  47. data/spec/concurrent/atomic/atomic_boolean_spec.rb +0 -172
  48. data/spec/concurrent/atomic/atomic_fixnum_spec.rb +0 -186
  49. data/spec/concurrent/atomic/atomic_spec.rb +0 -133
  50. data/spec/concurrent/atomic/condition_spec.rb +0 -171
  51. data/spec/concurrent/atomic/copy_on_notify_observer_set_spec.rb +0 -10
  52. data/spec/concurrent/atomic/copy_on_write_observer_set_spec.rb +0 -10
  53. data/spec/concurrent/atomic/count_down_latch_spec.rb +0 -151
  54. data/spec/concurrent/atomic/cyclic_barrier_spec.rb +0 -248
  55. data/spec/concurrent/atomic/event_spec.rb +0 -200
  56. data/spec/concurrent/atomic/observer_set_shared.rb +0 -242
  57. data/spec/concurrent/atomic/thread_local_var_spec.rb +0 -113
  58. data/spec/concurrent/channel/buffered_channel_spec.rb +0 -151
  59. data/spec/concurrent/channel/channel_spec.rb +0 -39
  60. data/spec/concurrent/channel/probe_spec.rb +0 -77
  61. data/spec/concurrent/channel/unbuffered_channel_spec.rb +0 -132
  62. data/spec/concurrent/collection/blocking_ring_buffer_spec.rb +0 -149
  63. data/spec/concurrent/collection/priority_queue_spec.rb +0 -317
  64. data/spec/concurrent/collection/ring_buffer_spec.rb +0 -126
  65. data/spec/concurrent/configuration_spec.rb +0 -71
  66. data/spec/concurrent/dataflow_spec.rb +0 -242
  67. data/spec/concurrent/delay_spec.rb +0 -91
  68. data/spec/concurrent/dereferenceable_shared.rb +0 -146
  69. data/spec/concurrent/exchanger_spec.rb +0 -66
  70. data/spec/concurrent/executor/cached_thread_pool_shared.rb +0 -115
  71. data/spec/concurrent/executor/fixed_thread_pool_shared.rb +0 -136
  72. data/spec/concurrent/executor/global_thread_pool_shared.rb +0 -35
  73. data/spec/concurrent/executor/immediate_executor_spec.rb +0 -12
  74. data/spec/concurrent/executor/java_cached_thread_pool_spec.rb +0 -44
  75. data/spec/concurrent/executor/java_fixed_thread_pool_spec.rb +0 -64
  76. data/spec/concurrent/executor/java_single_thread_executor_spec.rb +0 -21
  77. data/spec/concurrent/executor/java_thread_pool_executor_spec.rb +0 -71
  78. data/spec/concurrent/executor/per_thread_executor_spec.rb +0 -57
  79. data/spec/concurrent/executor/ruby_cached_thread_pool_spec.rb +0 -69
  80. data/spec/concurrent/executor/ruby_fixed_thread_pool_spec.rb +0 -39
  81. data/spec/concurrent/executor/ruby_single_thread_executor_spec.rb +0 -18
  82. data/spec/concurrent/executor/ruby_thread_pool_executor_spec.rb +0 -171
  83. data/spec/concurrent/executor/safe_task_executor_spec.rb +0 -103
  84. data/spec/concurrent/executor/thread_pool_class_cast_spec.rb +0 -52
  85. data/spec/concurrent/executor/thread_pool_executor_shared.rb +0 -155
  86. data/spec/concurrent/executor/thread_pool_shared.rb +0 -239
  87. data/spec/concurrent/executor/timer_set_spec.rb +0 -183
  88. data/spec/concurrent/future_spec.rb +0 -329
  89. data/spec/concurrent/ivar_spec.rb +0 -215
  90. data/spec/concurrent/mvar_spec.rb +0 -380
  91. data/spec/concurrent/obligation_shared.rb +0 -102
  92. data/spec/concurrent/obligation_spec.rb +0 -282
  93. data/spec/concurrent/observable_shared.rb +0 -177
  94. data/spec/concurrent/observable_spec.rb +0 -56
  95. data/spec/concurrent/options_parser_spec.rb +0 -71
  96. data/spec/concurrent/promise_spec.rb +0 -367
  97. data/spec/concurrent/runnable_shared.rb +0 -68
  98. data/spec/concurrent/runnable_spec.rb +0 -235
  99. data/spec/concurrent/scheduled_task_spec.rb +0 -342
  100. data/spec/concurrent/stoppable_shared.rb +0 -37
  101. data/spec/concurrent/supervisor_spec.rb +0 -1148
  102. data/spec/concurrent/timer_task_spec.rb +0 -258
  103. data/spec/concurrent/tvar_spec.rb +0 -137
  104. data/spec/concurrent/utility/processor_count_spec.rb +0 -20
  105. data/spec/concurrent/utility/timeout_spec.rb +0 -50
  106. data/spec/concurrent/utility/timer_spec.rb +0 -52
  107. data/spec/spec_helper.rb +0 -31
  108. data/spec/support/example_group_extensions.rb +0 -48
  109. data/spec/support/less_than_or_equal_to_matcher.rb +0 -5
  110. /data/{LICENSE → LICENSE.txt} +0 -0
@@ -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 = initial
66
- @rescuers = []
67
- @validator = Proc.new { |result| true }
68
- @timeout = opts.fetch(:timeout, TIMEOUT).freeze
69
- self.observers = CopyOnWriteObserverSet.new
70
- @one_by_one = OneByOne.new
71
- @task_executor = OptionsParser.get_task_executor_from(opts)
72
- @operation_executor = OptionsParser.get_operation_executor_from(opts)
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
- @one_by_one.post(executor) { work(&block) }
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,7 @@
1
+ module Concurrent
2
+
3
+ class ConcurrentUpdateError < ThreadError
4
+ # frozen pre-allocated backtrace to speed ConcurrentUpdateError
5
+ CONC_UP_ERR_BACKTRACE = ['backtrace elided; set verbose to enable'].freeze
6
+ end
7
+ 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,8 @@
1
+ require 'concurrent_ruby_ext'
2
+ require 'concurrent/atomic_reference/direct_update'
3
+
4
+ module Concurrent
5
+ class JavaAtomic
6
+ include Concurrent::AtomicDirectUpdate
7
+ end
8
+ 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
@@ -1,4 +1,4 @@
1
- require 'concurrent/atomic/atomic'
1
+ require 'concurrent/atomic'
2
2
  require 'concurrent/atomic/atomic_boolean'
3
3
  require 'concurrent/atomic/atomic_fixnum'
4
4
  require 'concurrent/atomic/condition'
@@ -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
- singleton_class.send :attr_reader, :configuration
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
  #
@@ -172,7 +172,6 @@ module Concurrent
172
172
 
173
173
  # @!visibility private
174
174
  def shutdown_execution
175
- @queue.clear
176
175
  if @pool.empty?
177
176
  stopped_event.set
178
177
  else
@@ -1,8 +1,10 @@
1
+ require 'concurrent/logging'
2
+
1
3
  module Concurrent
2
4
 
3
- # Ensures that jobs are passed to the given executors one by one,
4
- # never running at the same time.
5
- class OneByOne
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
- job.executor.post { work(job) }
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
- alias_method :kill, :shutdown
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
@@ -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/one_by_one'
9
+ require 'concurrent/executor/serialized_execution'
@@ -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
- # @yields_return [String] a message
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 chaning
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
@@ -1,3 +1,3 @@
1
1
  module Concurrent
2
- VERSION = '0.6.0'
2
+ VERSION = '0.7.0.rc0'
3
3
  end
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
@@ -0,0 +1,9 @@
1
+ require 'rbconfig'
2
+
3
+ module Concurrent
4
+ def self.use_c_extensions?
5
+ host_os = RbConfig::CONFIG['host_os']
6
+ ruby_name = RbConfig::CONFIG['ruby_install_name']
7
+ (ruby_name =~ /^ruby$/i || host_os =~ /mswin32/i || host_os =~ /mingw32/i)
8
+ end
9
+ end