diff --git a/lib/concurrent/agent.rb b/lib/concurrent/agent.rb index 76a706b2e..9938d92cb 100644 --- a/lib/concurrent/agent.rb +++ b/lib/concurrent/agent.rb @@ -28,6 +28,7 @@ def initialize(initial, opts = {}) @rescuers = [] @validator = nil @timeout = opts[:timeout] || TIMEOUT + init_mutex set_deref_options(opts) end diff --git a/lib/concurrent/contract.rb b/lib/concurrent/contract.rb index 1b055098a..536818f24 100644 --- a/lib/concurrent/contract.rb +++ b/lib/concurrent/contract.rb @@ -7,6 +7,7 @@ class Contract def initialize(opts = {}) @state = :pending + init_mutex set_deref_options(opts) end diff --git a/lib/concurrent/dereferenceable.rb b/lib/concurrent/dereferenceable.rb index 2de556fa3..5945ff39f 100644 --- a/lib/concurrent/dereferenceable.rb +++ b/lib/concurrent/dereferenceable.rb @@ -21,8 +21,8 @@ module Dereferenceable # returning the value returned from the proc (default: `nil`) def set_deref_options(opts = {}) mutex.synchronize do - @dup_on_deref = opts[:dup_on_deref] || opts[:dup] || false - @freeze_on_deref = opts[:freeze_on_deref] || opts[:freeze] || false + @dup_on_deref = opts[:dup_on_deref] || opts[:dup] + @freeze_on_deref = opts[:freeze_on_deref] || opts[:freeze] @copy_on_deref = opts[:copy_on_deref] || opts[:copy] @do_nothing_on_deref = ! (@dup_on_deref || @freeze_on_deref || @copy_on_deref) end @@ -33,7 +33,7 @@ def set_deref_options(opts = {}) def value return nil if @value.nil? return @value if @do_nothing_on_deref - return mutex.synchronize do + mutex.synchronize do value = @value value = @copy_on_deref.call(value) if @copy_on_deref value = value.dup if @dup_on_deref @@ -45,9 +45,12 @@ def value protected - # @private def mutex # :nodoc: - @mutex ||= Mutex.new + @mutex + end + + def init_mutex + @mutex = Mutex.new end end end diff --git a/lib/concurrent/future.rb b/lib/concurrent/future.rb index 76b97b1a1..fc78e132e 100644 --- a/lib/concurrent/future.rb +++ b/lib/concurrent/future.rb @@ -12,6 +12,7 @@ class Future include UsesGlobalThreadPool def initialize(*args, &block) + init_mutex unless block_given? @state = :fulfilled else diff --git a/lib/concurrent/promise.rb b/lib/concurrent/promise.rb index 0fbe1efc2..93624bc4f 100644 --- a/lib/concurrent/promise.rb +++ b/lib/concurrent/promise.rb @@ -41,6 +41,7 @@ def initialize(*args, &block) @children = [] @rescuers = [] + init_mutex realize(*args) if root? end diff --git a/lib/concurrent/scheduled_task.rb b/lib/concurrent/scheduled_task.rb index 6a1d2db80..30ed7fd06 100644 --- a/lib/concurrent/scheduled_task.rb +++ b/lib/concurrent/scheduled_task.rb @@ -29,6 +29,7 @@ def initialize(schedule_time, opts = {}, &block) @state = :pending @schedule_time.freeze @task = block + init_mutex set_deref_options(opts) @thread = Thread.new{ work } diff --git a/lib/concurrent/timer_task.rb b/lib/concurrent/timer_task.rb index abe1db0ef..b2a05c571 100644 --- a/lib/concurrent/timer_task.rb +++ b/lib/concurrent/timer_task.rb @@ -198,6 +198,7 @@ def initialize(opts = {}, &block) @run_now = opts[:now] || opts[:run_now] || false @task = block + init_mutex set_deref_options(opts) end