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
 
| 
         @@ -8,7 +8,7 @@ module Concurrent 
     | 
|
| 
       8 
8 
     | 
    
         
             
                  end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
                  def on_jruby_9000?
         
     | 
| 
       11 
     | 
    
         
            -
                    on_jruby? && ruby_version(:>=, 9, 0, 0 
     | 
| 
      
 11 
     | 
    
         
            +
                    on_jruby? && ruby_version(JRUBY_VERSION, :>=, 9, 0, 0)
         
     | 
| 
       12 
12 
     | 
    
         
             
                  end
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
                  def on_cruby?
         
     | 
| 
         @@ -19,8 +19,8 @@ module Concurrent 
     | 
|
| 
       19 
19 
     | 
    
         
             
                    ruby_engine == 'rbx'
         
     | 
| 
       20 
20 
     | 
    
         
             
                  end
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                  def  
     | 
| 
       23 
     | 
    
         
            -
                    ruby_engine == ' 
     | 
| 
      
 22 
     | 
    
         
            +
                  def on_truffleruby?
         
     | 
| 
      
 23 
     | 
    
         
            +
                    ruby_engine == 'truffleruby'
         
     | 
| 
       24 
24 
     | 
    
         
             
                  end
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
                  def on_windows?
         
     | 
| 
         @@ -39,7 +39,7 @@ module Concurrent 
     | 
|
| 
       39 
39 
     | 
    
         
             
                    defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'
         
     | 
| 
       40 
40 
     | 
    
         
             
                  end
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
                  def ruby_version(comparison, major, minor, patch 
     | 
| 
      
 42 
     | 
    
         
            +
                  def ruby_version(version = RUBY_VERSION, comparison, major, minor, patch)
         
     | 
| 
       43 
43 
     | 
    
         
             
                    result      = (version.split('.').map(&:to_i) <=> [major, minor, patch])
         
     | 
| 
       44 
44 
     | 
    
         
             
                    comparisons = { :== => [0],
         
     | 
| 
       45 
45 
     | 
    
         
             
                                    :>= => [1, 0],
         
     | 
| 
         @@ -42,12 +42,12 @@ module Concurrent 
     | 
|
| 
       42 
42 
     | 
    
         
             
              GLOBAL_MONOTONIC_CLOCK = class_definition.new
         
     | 
| 
       43 
43 
     | 
    
         
             
              private_constant :GLOBAL_MONOTONIC_CLOCK
         
     | 
| 
       44 
44 
     | 
    
         | 
| 
       45 
     | 
    
         
            -
              # @!macro  
     | 
| 
      
 45 
     | 
    
         
            +
              # @!macro monotonic_get_time
         
     | 
| 
       46 
46 
     | 
    
         
             
              #
         
     | 
| 
       47 
47 
     | 
    
         
             
              #   Returns the current time a tracked by the application monotonic clock.
         
     | 
| 
       48 
48 
     | 
    
         
             
              #
         
     | 
| 
       49 
     | 
    
         
            -
              #   @return [Float] The current monotonic time  
     | 
| 
       50 
     | 
    
         
            -
              #      
     | 
| 
      
 49 
     | 
    
         
            +
              #   @return [Float] The current monotonic time since some unspecified
         
     | 
| 
      
 50 
     | 
    
         
            +
              #     starting point
         
     | 
| 
       51 
51 
     | 
    
         
             
              #
         
     | 
| 
       52 
52 
     | 
    
         
             
              #   @!macro monotonic_clock_warning
         
     | 
| 
       53 
53 
     | 
    
         
             
              def monotonic_time
         
     | 
| 
         @@ -12,19 +12,11 @@ module Concurrent 
     | 
|
| 
       12 
12 
     | 
    
         
             
                  end
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
                  def c_extensions_loaded?
         
     | 
| 
       15 
     | 
    
         
            -
                    @c_extensions_loaded  
     | 
| 
      
 15 
     | 
    
         
            +
                    defined?(@c_extensions_loaded) && @c_extensions_loaded
         
     | 
| 
       16 
16 
     | 
    
         
             
                  end
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         
             
                  def java_extensions_loaded?
         
     | 
| 
       19 
     | 
    
         
            -
                    @java_extensions_loaded  
     | 
| 
       20 
     | 
    
         
            -
                  end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                  def set_c_extensions_loaded
         
     | 
| 
       23 
     | 
    
         
            -
                    @c_extensions_loaded = true
         
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                  def set_java_extensions_loaded
         
     | 
| 
       27 
     | 
    
         
            -
                    @java_extensions_loaded = true
         
     | 
| 
      
 19 
     | 
    
         
            +
                    defined?(@java_extensions_loaded) && @java_extensions_loaded
         
     | 
| 
       28 
20 
     | 
    
         
             
                  end
         
     | 
| 
       29 
21 
     | 
    
         | 
| 
       30 
22 
     | 
    
         
             
                  def load_native_extensions
         
     | 
| 
         @@ -33,37 +25,43 @@ module Concurrent 
     | 
|
| 
       33 
25 
     | 
    
         
             
                    end
         
     | 
| 
       34 
26 
     | 
    
         | 
| 
       35 
27 
     | 
    
         
             
                    if Concurrent.on_cruby? && !c_extensions_loaded?
         
     | 
| 
       36 
     | 
    
         
            -
                       
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                          set_c_extensions_loaded
         
     | 
| 
       40 
     | 
    
         
            -
                        end,
         
     | 
| 
       41 
     | 
    
         
            -
                        lambda do
         
     | 
| 
       42 
     | 
    
         
            -
                          # may be a Windows cross-compiled native gem
         
     | 
| 
       43 
     | 
    
         
            -
                          require "concurrent/#{RUBY_VERSION[0..2]}/extension"
         
     | 
| 
       44 
     | 
    
         
            -
                          set_c_extensions_loaded
         
     | 
| 
       45 
     | 
    
         
            -
                        end]
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
                      tries.each do |try|
         
     | 
| 
       48 
     | 
    
         
            -
                        begin
         
     | 
| 
       49 
     | 
    
         
            -
                          try.call
         
     | 
| 
       50 
     | 
    
         
            -
                          break
         
     | 
| 
       51 
     | 
    
         
            -
                        rescue LoadError
         
     | 
| 
       52 
     | 
    
         
            -
                          next
         
     | 
| 
       53 
     | 
    
         
            -
                        end
         
     | 
| 
       54 
     | 
    
         
            -
                      end
         
     | 
| 
      
 28 
     | 
    
         
            +
                      ['concurrent/concurrent_ruby_ext',
         
     | 
| 
      
 29 
     | 
    
         
            +
                       "concurrent/#{RUBY_VERSION[0..2]}/concurrent_ruby_ext"
         
     | 
| 
      
 30 
     | 
    
         
            +
                      ].each { |p| try_load_c_extension p }
         
     | 
| 
       55 
31 
     | 
    
         
             
                    end
         
     | 
| 
       56 
32 
     | 
    
         | 
| 
       57 
33 
     | 
    
         
             
                    if Concurrent.on_jruby? && !java_extensions_loaded?
         
     | 
| 
       58 
34 
     | 
    
         
             
                      begin
         
     | 
| 
       59 
     | 
    
         
            -
                        require ' 
     | 
| 
      
 35 
     | 
    
         
            +
                        require 'concurrent/concurrent_ruby.jar'
         
     | 
| 
       60 
36 
     | 
    
         
             
                        set_java_extensions_loaded
         
     | 
| 
       61 
     | 
    
         
            -
                      rescue LoadError
         
     | 
| 
       62 
     | 
    
         
            -
                         
     | 
| 
       63 
     | 
    
         
            -
                        raise 'On JRuby but Java extensions failed to load.'
         
     | 
| 
      
 37 
     | 
    
         
            +
                      rescue LoadError => e
         
     | 
| 
      
 38 
     | 
    
         
            +
                        raise e, "Java extensions are required for JRuby.\n" + e.message, e.backtrace
         
     | 
| 
       64 
39 
     | 
    
         
             
                      end
         
     | 
| 
       65 
40 
     | 
    
         
             
                    end
         
     | 
| 
       66 
41 
     | 
    
         
             
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                  private
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  def set_c_extensions_loaded
         
     | 
| 
      
 46 
     | 
    
         
            +
                    @c_extensions_loaded = true
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  def set_java_extensions_loaded
         
     | 
| 
      
 50 
     | 
    
         
            +
                    @java_extensions_loaded = true
         
     | 
| 
      
 51 
     | 
    
         
            +
                  end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                  def try_load_c_extension(path)
         
     | 
| 
      
 54 
     | 
    
         
            +
                    require path
         
     | 
| 
      
 55 
     | 
    
         
            +
                    set_c_extensions_loaded
         
     | 
| 
      
 56 
     | 
    
         
            +
                  rescue LoadError => e
         
     | 
| 
      
 57 
     | 
    
         
            +
                    if e.path == path
         
     | 
| 
      
 58 
     | 
    
         
            +
                      # move on with pure-Ruby implementations
         
     | 
| 
      
 59 
     | 
    
         
            +
                      # TODO (pitr-ch 12-Jul-2018): warning on verbose?
         
     | 
| 
      
 60 
     | 
    
         
            +
                    else
         
     | 
| 
      
 61 
     | 
    
         
            +
                      raise e
         
     | 
| 
      
 62 
     | 
    
         
            +
                    end
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
       67 
65 
     | 
    
         
             
                end
         
     | 
| 
       68 
66 
     | 
    
         
             
              end
         
     | 
| 
       69 
67 
     | 
    
         | 
| 
         @@ -76,8 +76,6 @@ module Concurrent 
     | 
|
| 
       76 
76 
     | 
    
         
             
                  def compute_processor_count
         
     | 
| 
       77 
77 
     | 
    
         
             
                    if Concurrent.on_jruby?
         
     | 
| 
       78 
78 
     | 
    
         
             
                      java.lang.Runtime.getRuntime.availableProcessors
         
     | 
| 
       79 
     | 
    
         
            -
                    elsif Concurrent.on_truffle?
         
     | 
| 
       80 
     | 
    
         
            -
                      Truffle::Primitive.logical_processors
         
     | 
| 
       81 
79 
     | 
    
         
             
                    else
         
     | 
| 
       82 
80 
     | 
    
         
             
                      os_name = RbConfig::CONFIG["target_os"]
         
     | 
| 
       83 
81 
     | 
    
         
             
                      if os_name =~ /mingw|mswin/
         
     | 
    
        data/lib/concurrent/version.rb
    CHANGED
    
    
| 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative "./concurrent"
         
     | 
    
        data/lib/concurrent.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'concurrent/utility/193'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            require 'concurrent/version'
         
     | 
| 
       2 
4 
     | 
    
         
             
            require 'concurrent/constants'
         
     | 
| 
       3 
5 
     | 
    
         
             
            require 'concurrent/errors'
         
     | 
| 
         @@ -7,11 +9,13 @@ require 'concurrent/atomics' 
     | 
|
| 
       7 
9 
     | 
    
         
             
            require 'concurrent/executors'
         
     | 
| 
       8 
10 
     | 
    
         
             
            require 'concurrent/synchronization'
         
     | 
| 
       9 
11 
     | 
    
         | 
| 
      
 12 
     | 
    
         
            +
            require 'concurrent/atomic/atomic_markable_reference'
         
     | 
| 
       10 
13 
     | 
    
         
             
            require 'concurrent/atomic/atomic_reference'
         
     | 
| 
       11 
14 
     | 
    
         
             
            require 'concurrent/agent'
         
     | 
| 
       12 
15 
     | 
    
         
             
            require 'concurrent/atom'
         
     | 
| 
       13 
16 
     | 
    
         
             
            require 'concurrent/array'
         
     | 
| 
       14 
17 
     | 
    
         
             
            require 'concurrent/hash'
         
     | 
| 
      
 18 
     | 
    
         
            +
            require 'concurrent/set'
         
     | 
| 
       15 
19 
     | 
    
         
             
            require 'concurrent/map'
         
     | 
| 
       16 
20 
     | 
    
         
             
            require 'concurrent/tuple'
         
     | 
| 
       17 
21 
     | 
    
         
             
            require 'concurrent/async'
         
     | 
| 
         @@ -29,20 +33,21 @@ require 'concurrent/scheduled_task' 
     | 
|
| 
       29 
33 
     | 
    
         
             
            require 'concurrent/settable_struct'
         
     | 
| 
       30 
34 
     | 
    
         
             
            require 'concurrent/timer_task'
         
     | 
| 
       31 
35 
     | 
    
         
             
            require 'concurrent/tvar'
         
     | 
| 
      
 36 
     | 
    
         
            +
            require 'concurrent/promises'
         
     | 
| 
       32 
37 
     | 
    
         | 
| 
       33 
38 
     | 
    
         
             
            require 'concurrent/thread_safe/synchronized_delegator'
         
     | 
| 
       34 
39 
     | 
    
         
             
            require 'concurrent/thread_safe/util'
         
     | 
| 
       35 
40 
     | 
    
         | 
| 
       36 
41 
     | 
    
         
             
            require 'concurrent/options'
         
     | 
| 
       37 
42 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
            # @!macro  
     | 
| 
      
 43 
     | 
    
         
            +
            # @!macro internal_implementation_note
         
     | 
| 
       39 
44 
     | 
    
         
             
            #
         
     | 
| 
       40 
45 
     | 
    
         
             
            #   @note **Private Implementation:** This abstraction is a private, internal
         
     | 
| 
       41 
46 
     | 
    
         
             
            #     implementation detail. It should never be used directly.
         
     | 
| 
       42 
47 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
            # @!macro  
     | 
| 
      
 48 
     | 
    
         
            +
            # @!macro monotonic_clock_warning
         
     | 
| 
       44 
49 
     | 
    
         
             
            #
         
     | 
| 
       45 
     | 
    
         
            -
            #   @note Time calculations  
     | 
| 
      
 50 
     | 
    
         
            +
            #   @note Time calculations on all platforms and languages are sensitive to
         
     | 
| 
       46 
51 
     | 
    
         
             
            #     changes to the system clock. To alleviate the potential problems
         
     | 
| 
       47 
52 
     | 
    
         
             
            #     associated with changing the system clock while an application is running,
         
     | 
| 
       48 
53 
     | 
    
         
             
            #     most modern operating systems provide a monotonic clock that operates
         
     | 
| 
         @@ -58,7 +63,7 @@ require 'concurrent/options' 
     | 
|
| 
       58 
63 
     | 
    
         
             
            #
         
     | 
| 
       59 
64 
     | 
    
         
             
            #   @see http://linux.die.net/man/3/clock_gettime Linux clock_gettime(3)
         
     | 
| 
       60 
65 
     | 
    
         | 
| 
       61 
     | 
    
         
            -
            # @!macro  
     | 
| 
      
 66 
     | 
    
         
            +
            # @!macro copy_options
         
     | 
| 
       62 
67 
     | 
    
         
             
            #
         
     | 
| 
       63 
68 
     | 
    
         
             
            #   ## Copy Options
         
     | 
| 
       64 
69 
     | 
    
         
             
            #
         
     | 
| 
         @@ -94,7 +99,7 @@ require 'concurrent/options' 
     | 
|
| 
       94 
99 
     | 
    
         
             
            #   as close to the behavior of a "pure" functional language (like Erlang, Clojure,
         
     | 
| 
       95 
100 
     | 
    
         
             
            #   or Haskell) as we are likely to get in Ruby.
         
     | 
| 
       96 
101 
     | 
    
         | 
| 
       97 
     | 
    
         
            -
            # @!macro  
     | 
| 
      
 102 
     | 
    
         
            +
            # @!macro deref_options
         
     | 
| 
       98 
103 
     | 
    
         
             
            #
         
     | 
| 
       99 
104 
     | 
    
         
             
            #   @option opts [Boolean] :dup_on_deref (false) Call `#dup` before
         
     | 
| 
       100 
105 
     | 
    
         
             
            #     returning the data from {#value}
         
     | 
| 
         @@ -104,27 +109,28 @@ require 'concurrent/options' 
     | 
|
| 
       104 
109 
     | 
    
         
             
            #     method, call the given proc passing the internal value as the sole
         
     | 
| 
       105 
110 
     | 
    
         
             
            #     argument then return the new value returned from the proc.
         
     | 
| 
       106 
111 
     | 
    
         | 
| 
       107 
     | 
    
         
            -
            # @!macro  
     | 
| 
      
 112 
     | 
    
         
            +
            # @!macro executor_and_deref_options
         
     | 
| 
       108 
113 
     | 
    
         
             
            #
         
     | 
| 
       109 
114 
     | 
    
         
             
            #   @param [Hash] opts the options used to define the behavior at update and deref
         
     | 
| 
       110 
115 
     | 
    
         
             
            #     and to specify the executor on which to perform actions
         
     | 
| 
       111 
116 
     | 
    
         
             
            #   @option opts [Executor] :executor when set use the given `Executor` instance.
         
     | 
| 
       112 
     | 
    
         
            -
            #     Three special values are also supported: `: 
     | 
| 
       113 
     | 
    
         
            -
            #     `: 
     | 
| 
       114 
     | 
    
         
            -
            #     `ImmediateExecutor` object.
         
     | 
| 
      
 117 
     | 
    
         
            +
            #     Three special values are also supported: `:io` returns the global pool for
         
     | 
| 
      
 118 
     | 
    
         
            +
            #     long, blocking (IO) tasks, `:fast` returns the global pool for short, fast
         
     | 
| 
      
 119 
     | 
    
         
            +
            #     operations, and `:immediate` returns the global `ImmediateExecutor` object.
         
     | 
| 
       115 
120 
     | 
    
         
             
            #   @!macro deref_options
         
     | 
| 
       116 
121 
     | 
    
         | 
| 
       117 
     | 
    
         
            -
            #  
     | 
| 
       118 
     | 
    
         
            -
            #  
     | 
| 
       119 
     | 
    
         
            -
            #
         
     | 
| 
       120 
     | 
    
         
            -
            # The design goals of this gem are:
         
     | 
| 
      
 122 
     | 
    
         
            +
            # @!macro warn.edge
         
     | 
| 
      
 123 
     | 
    
         
            +
            #   @api Edge
         
     | 
| 
      
 124 
     | 
    
         
            +
            #   @note **Edge Features** are under active development and may change frequently.
         
     | 
| 
       121 
125 
     | 
    
         
             
            #
         
     | 
| 
       122 
     | 
    
         
            -
            #  
     | 
| 
       123 
     | 
    
         
            -
            #  
     | 
| 
       124 
     | 
    
         
            -
            #  
     | 
| 
       125 
     | 
    
         
            -
            #  
     | 
| 
       126 
     | 
    
         
            -
            #  
     | 
| 
       127 
     | 
    
         
            -
            #  
     | 
| 
       128 
     | 
    
         
            -
            module Concurrent
         
     | 
| 
      
 126 
     | 
    
         
            +
            #     -   Deprecations are not added before incompatible changes.
         
     | 
| 
      
 127 
     | 
    
         
            +
            #     -   Edge version: _major_ is always 0, _minor_ bump means incompatible change,
         
     | 
| 
      
 128 
     | 
    
         
            +
            #         _patch_ bump means compatible change.
         
     | 
| 
      
 129 
     | 
    
         
            +
            #     -   Edge features may also lack tests and documentation.
         
     | 
| 
      
 130 
     | 
    
         
            +
            #     -   Features developed in `concurrent-ruby-edge` are expected to move
         
     | 
| 
      
 131 
     | 
    
         
            +
            #         to `concurrent-ruby` when finalised.
         
     | 
| 
       129 
132 
     | 
    
         | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
      
 134 
     | 
    
         
            +
            # {include:file:README.md}
         
     | 
| 
      
 135 
     | 
    
         
            +
            module Concurrent
         
     | 
| 
       130 
136 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: concurrent-ruby
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.1.1
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Jerry D'Antonio
         
     | 
| 
         @@ -10,7 +10,7 @@ authors: 
     | 
|
| 
       10 
10 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       11 
11 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       12 
12 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       13 
     | 
    
         
            -
            date:  
     | 
| 
      
 13 
     | 
    
         
            +
            date: 2018-11-05 00:00:00.000000000 Z
         
     | 
| 
       14 
14 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       15 
15 
     | 
    
         
             
            description: |
         
     | 
| 
       16 
16 
     | 
    
         
             
              Modern concurrency tools including agents, futures, promises, thread pools, actors, supervisors, and more.
         
     | 
| 
         @@ -20,12 +20,30 @@ executables: [] 
     | 
|
| 
       20 
20 
     | 
    
         
             
            extensions: []
         
     | 
| 
       21 
21 
     | 
    
         
             
            extra_rdoc_files:
         
     | 
| 
       22 
22 
     | 
    
         
             
            - README.md
         
     | 
| 
       23 
     | 
    
         
            -
            - LICENSE. 
     | 
| 
      
 23 
     | 
    
         
            +
            - LICENSE.md
         
     | 
| 
       24 
24 
     | 
    
         
             
            - CHANGELOG.md
         
     | 
| 
       25 
25 
     | 
    
         
             
            files:
         
     | 
| 
       26 
26 
     | 
    
         
             
            - CHANGELOG.md
         
     | 
| 
       27 
     | 
    
         
            -
            -  
     | 
| 
      
 27 
     | 
    
         
            +
            - Gemfile
         
     | 
| 
      
 28 
     | 
    
         
            +
            - LICENSE.md
         
     | 
| 
       28 
29 
     | 
    
         
             
            - README.md
         
     | 
| 
      
 30 
     | 
    
         
            +
            - Rakefile
         
     | 
| 
      
 31 
     | 
    
         
            +
            - ext/concurrent-ruby/ConcurrentRubyService.java
         
     | 
| 
      
 32 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/AtomicReferenceLibrary.java
         
     | 
| 
      
 33 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/JRubyMapBackendLibrary.java
         
     | 
| 
      
 34 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicBooleanLibrary.java
         
     | 
| 
      
 35 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicFixnumLibrary.java
         
     | 
| 
      
 36 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/JavaSemaphoreLibrary.java
         
     | 
| 
      
 37 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java
         
     | 
| 
      
 38 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMap.java
         
     | 
| 
      
 39 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMapV8.java
         
     | 
| 
      
 40 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/LongAdder.java
         
     | 
| 
      
 41 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/Striped64.java
         
     | 
| 
      
 42 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/ConcurrentHashMapV8.java
         
     | 
| 
      
 43 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/LongAdder.java
         
     | 
| 
      
 44 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/Striped64.java
         
     | 
| 
      
 45 
     | 
    
         
            +
            - ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166y/ThreadLocalRandom.java
         
     | 
| 
      
 46 
     | 
    
         
            +
            - lib/concurrent-ruby.rb
         
     | 
| 
       29 
47 
     | 
    
         
             
            - lib/concurrent.rb
         
     | 
| 
       30 
48 
     | 
    
         
             
            - lib/concurrent/agent.rb
         
     | 
| 
       31 
49 
     | 
    
         
             
            - lib/concurrent/array.rb
         
     | 
| 
         @@ -34,6 +52,7 @@ files: 
     | 
|
| 
       34 
52 
     | 
    
         
             
            - lib/concurrent/atomic/abstract_thread_local_var.rb
         
     | 
| 
       35 
53 
     | 
    
         
             
            - lib/concurrent/atomic/atomic_boolean.rb
         
     | 
| 
       36 
54 
     | 
    
         
             
            - lib/concurrent/atomic/atomic_fixnum.rb
         
     | 
| 
      
 55 
     | 
    
         
            +
            - lib/concurrent/atomic/atomic_markable_reference.rb
         
     | 
| 
       37 
56 
     | 
    
         
             
            - lib/concurrent/atomic/atomic_reference.rb
         
     | 
| 
       38 
57 
     | 
    
         
             
            - lib/concurrent/atomic/count_down_latch.rb
         
     | 
| 
       39 
58 
     | 
    
         
             
            - lib/concurrent/atomic/cyclic_barrier.rb
         
     | 
| 
         @@ -49,18 +68,13 @@ files: 
     | 
|
| 
       49 
68 
     | 
    
         
             
            - lib/concurrent/atomic/ruby_thread_local_var.rb
         
     | 
| 
       50 
69 
     | 
    
         
             
            - lib/concurrent/atomic/semaphore.rb
         
     | 
| 
       51 
70 
     | 
    
         
             
            - lib/concurrent/atomic/thread_local_var.rb
         
     | 
| 
       52 
     | 
    
         
            -
            - lib/concurrent/atomic_reference/concurrent_update_error.rb
         
     | 
| 
       53 
     | 
    
         
            -
            - lib/concurrent/atomic_reference/direct_update.rb
         
     | 
| 
       54 
     | 
    
         
            -
            - lib/concurrent/atomic_reference/jruby+truffle.rb
         
     | 
| 
       55 
     | 
    
         
            -
            - lib/concurrent/atomic_reference/jruby.rb
         
     | 
| 
       56 
71 
     | 
    
         
             
            - lib/concurrent/atomic_reference/mutex_atomic.rb
         
     | 
| 
       57 
72 
     | 
    
         
             
            - lib/concurrent/atomic_reference/numeric_cas_wrapper.rb
         
     | 
| 
       58 
     | 
    
         
            -
            - lib/concurrent/atomic_reference/rbx.rb
         
     | 
| 
       59 
     | 
    
         
            -
            - lib/concurrent/atomic_reference/ruby.rb
         
     | 
| 
       60 
73 
     | 
    
         
             
            - lib/concurrent/atomics.rb
         
     | 
| 
       61 
74 
     | 
    
         
             
            - lib/concurrent/collection/copy_on_notify_observer_set.rb
         
     | 
| 
       62 
75 
     | 
    
         
             
            - lib/concurrent/collection/copy_on_write_observer_set.rb
         
     | 
| 
       63 
76 
     | 
    
         
             
            - lib/concurrent/collection/java_non_concurrent_priority_queue.rb
         
     | 
| 
      
 77 
     | 
    
         
            +
            - lib/concurrent/collection/lock_free_stack.rb
         
     | 
| 
       64 
78 
     | 
    
         
             
            - lib/concurrent/collection/map/atomic_reference_map_backend.rb
         
     | 
| 
       65 
79 
     | 
    
         
             
            - lib/concurrent/collection/map/mri_map_backend.rb
         
     | 
| 
       66 
80 
     | 
    
         
             
            - lib/concurrent/collection/map/non_concurrent_map_backend.rb
         
     | 
| 
         @@ -72,11 +86,11 @@ files: 
     | 
|
| 
       72 
86 
     | 
    
         
             
            - lib/concurrent/concern/logging.rb
         
     | 
| 
       73 
87 
     | 
    
         
             
            - lib/concurrent/concern/obligation.rb
         
     | 
| 
       74 
88 
     | 
    
         
             
            - lib/concurrent/concern/observable.rb
         
     | 
| 
      
 89 
     | 
    
         
            +
            - lib/concurrent/concurrent_ruby.jar
         
     | 
| 
       75 
90 
     | 
    
         
             
            - lib/concurrent/configuration.rb
         
     | 
| 
       76 
91 
     | 
    
         
             
            - lib/concurrent/constants.rb
         
     | 
| 
       77 
92 
     | 
    
         
             
            - lib/concurrent/dataflow.rb
         
     | 
| 
       78 
93 
     | 
    
         
             
            - lib/concurrent/delay.rb
         
     | 
| 
       79 
     | 
    
         
            -
            - lib/concurrent/edge.rb
         
     | 
| 
       80 
94 
     | 
    
         
             
            - lib/concurrent/errors.rb
         
     | 
| 
       81 
95 
     | 
    
         
             
            - lib/concurrent/exchanger.rb
         
     | 
| 
       82 
96 
     | 
    
         
             
            - lib/concurrent/executor/abstract_executor_service.rb
         
     | 
| 
         @@ -104,14 +118,16 @@ files: 
     | 
|
| 
       104 
118 
     | 
    
         
             
            - lib/concurrent/hash.rb
         
     | 
| 
       105 
119 
     | 
    
         
             
            - lib/concurrent/immutable_struct.rb
         
     | 
| 
       106 
120 
     | 
    
         
             
            - lib/concurrent/ivar.rb
         
     | 
| 
       107 
     | 
    
         
            -
            - lib/concurrent/lazy_register.rb
         
     | 
| 
       108 
121 
     | 
    
         
             
            - lib/concurrent/map.rb
         
     | 
| 
       109 
122 
     | 
    
         
             
            - lib/concurrent/maybe.rb
         
     | 
| 
       110 
123 
     | 
    
         
             
            - lib/concurrent/mutable_struct.rb
         
     | 
| 
       111 
124 
     | 
    
         
             
            - lib/concurrent/mvar.rb
         
     | 
| 
       112 
125 
     | 
    
         
             
            - lib/concurrent/options.rb
         
     | 
| 
       113 
126 
     | 
    
         
             
            - lib/concurrent/promise.rb
         
     | 
| 
      
 127 
     | 
    
         
            +
            - lib/concurrent/promises.rb
         
     | 
| 
      
 128 
     | 
    
         
            +
            - lib/concurrent/re_include.rb
         
     | 
| 
       114 
129 
     | 
    
         
             
            - lib/concurrent/scheduled_task.rb
         
     | 
| 
      
 130 
     | 
    
         
            +
            - lib/concurrent/set.rb
         
     | 
| 
       115 
131 
     | 
    
         
             
            - lib/concurrent/settable_struct.rb
         
     | 
| 
       116 
132 
     | 
    
         
             
            - lib/concurrent/synchronization.rb
         
     | 
| 
       117 
133 
     | 
    
         
             
            - lib/concurrent/synchronization/abstract_lockable_object.rb
         
     | 
| 
         @@ -122,19 +138,18 @@ files: 
     | 
|
| 
       122 
138 
     | 
    
         
             
            - lib/concurrent/synchronization/jruby_object.rb
         
     | 
| 
       123 
139 
     | 
    
         
             
            - lib/concurrent/synchronization/lock.rb
         
     | 
| 
       124 
140 
     | 
    
         
             
            - lib/concurrent/synchronization/lockable_object.rb
         
     | 
| 
       125 
     | 
    
         
            -
            - lib/concurrent/synchronization/mri_lockable_object.rb
         
     | 
| 
       126 
141 
     | 
    
         
             
            - lib/concurrent/synchronization/mri_object.rb
         
     | 
| 
      
 142 
     | 
    
         
            +
            - lib/concurrent/synchronization/mutex_lockable_object.rb
         
     | 
| 
       127 
143 
     | 
    
         
             
            - lib/concurrent/synchronization/object.rb
         
     | 
| 
       128 
144 
     | 
    
         
             
            - lib/concurrent/synchronization/rbx_lockable_object.rb
         
     | 
| 
       129 
145 
     | 
    
         
             
            - lib/concurrent/synchronization/rbx_object.rb
         
     | 
| 
       130 
     | 
    
         
            -
            - lib/concurrent/synchronization/ 
     | 
| 
       131 
     | 
    
         
            -
            - lib/concurrent/synchronization/truffle_object.rb
         
     | 
| 
      
 146 
     | 
    
         
            +
            - lib/concurrent/synchronization/truffleruby_object.rb
         
     | 
| 
       132 
147 
     | 
    
         
             
            - lib/concurrent/synchronization/volatile.rb
         
     | 
| 
       133 
148 
     | 
    
         
             
            - lib/concurrent/thread_safe/synchronized_delegator.rb
         
     | 
| 
       134 
149 
     | 
    
         
             
            - lib/concurrent/thread_safe/util.rb
         
     | 
| 
       135 
150 
     | 
    
         
             
            - lib/concurrent/thread_safe/util/adder.rb
         
     | 
| 
       136 
     | 
    
         
            -
            - lib/concurrent/thread_safe/util/array_hash_rbx.rb
         
     | 
| 
       137 
151 
     | 
    
         
             
            - lib/concurrent/thread_safe/util/cheap_lockable.rb
         
     | 
| 
      
 152 
     | 
    
         
            +
            - lib/concurrent/thread_safe/util/data_structures.rb
         
     | 
| 
       138 
153 
     | 
    
         
             
            - lib/concurrent/thread_safe/util/power_of_two_tuple.rb
         
     | 
| 
       139 
154 
     | 
    
         
             
            - lib/concurrent/thread_safe/util/striped64.rb
         
     | 
| 
       140 
155 
     | 
    
         
             
            - lib/concurrent/thread_safe/util/volatile.rb
         
     | 
| 
         @@ -142,6 +157,7 @@ files: 
     | 
|
| 
       142 
157 
     | 
    
         
             
            - lib/concurrent/timer_task.rb
         
     | 
| 
       143 
158 
     | 
    
         
             
            - lib/concurrent/tuple.rb
         
     | 
| 
       144 
159 
     | 
    
         
             
            - lib/concurrent/tvar.rb
         
     | 
| 
      
 160 
     | 
    
         
            +
            - lib/concurrent/utility/193.rb
         
     | 
| 
       145 
161 
     | 
    
         
             
            - lib/concurrent/utility/at_exit.rb
         
     | 
| 
       146 
162 
     | 
    
         
             
            - lib/concurrent/utility/engine.rb
         
     | 
| 
       147 
163 
     | 
    
         
             
            - lib/concurrent/utility/monotonic_time.rb
         
     | 
| 
         @@ -169,10 +185,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       169 
185 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       170 
186 
     | 
    
         
             
            requirements: []
         
     | 
| 
       171 
187 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       172 
     | 
    
         
            -
            rubygems_version: 2. 
     | 
| 
      
 188 
     | 
    
         
            +
            rubygems_version: 2.7.3
         
     | 
| 
       173 
189 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       174 
190 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       175 
191 
     | 
    
         
             
            summary: Modern concurrency tools for Ruby. Inspired by Erlang, Clojure, Scala, Haskell,
         
     | 
| 
       176 
192 
     | 
    
         
             
              F#, C#, Java, and classic concurrency patterns.
         
     | 
| 
       177 
193 
     | 
    
         
             
            test_files: []
         
     | 
| 
       178 
     | 
    
         
            -
            has_rdoc: 
         
     | 
| 
         @@ -1,81 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'concurrent/atomic_reference/concurrent_update_error'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            module Concurrent
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
              # Define update methods that use direct paths
         
     | 
| 
       6 
     | 
    
         
            -
              #
         
     | 
| 
       7 
     | 
    
         
            -
              # @!visibility private
         
     | 
| 
       8 
     | 
    
         
            -
              # @!macro internal_implementation_note
         
     | 
| 
       9 
     | 
    
         
            -
              module AtomicDirectUpdate
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                # @!macro [attach] atomic_reference_method_update
         
     | 
| 
       12 
     | 
    
         
            -
                #
         
     | 
| 
       13 
     | 
    
         
            -
                # Pass the current value to the given block, replacing it
         
     | 
| 
       14 
     | 
    
         
            -
                # with the block's result. May retry if the value changes
         
     | 
| 
       15 
     | 
    
         
            -
                # during the block's execution.
         
     | 
| 
       16 
     | 
    
         
            -
                #
         
     | 
| 
       17 
     | 
    
         
            -
                # @yield [Object] Calculate a new value for the atomic reference using
         
     | 
| 
       18 
     | 
    
         
            -
                #   given (old) value
         
     | 
| 
       19 
     | 
    
         
            -
                # @yieldparam [Object] old_value the starting value of the atomic reference
         
     | 
| 
       20 
     | 
    
         
            -
                #
         
     | 
| 
       21 
     | 
    
         
            -
                # @return [Object] the new value
         
     | 
| 
       22 
     | 
    
         
            -
                def update
         
     | 
| 
       23 
     | 
    
         
            -
                  true until compare_and_set(old_value = get, new_value = yield(old_value))
         
     | 
| 
       24 
     | 
    
         
            -
                  new_value
         
     | 
| 
       25 
     | 
    
         
            -
                end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                # @!macro [attach] atomic_reference_method_try_update
         
     | 
| 
       28 
     | 
    
         
            -
                #
         
     | 
| 
       29 
     | 
    
         
            -
                # Pass the current value to the given block, replacing it
         
     | 
| 
       30 
     | 
    
         
            -
                # with the block's result. Return nil if the update fails.
         
     | 
| 
       31 
     | 
    
         
            -
                #
         
     | 
| 
       32 
     | 
    
         
            -
                # @yield [Object] Calculate a new value for the atomic reference using
         
     | 
| 
       33 
     | 
    
         
            -
                #   given (old) value
         
     | 
| 
       34 
     | 
    
         
            -
                # @yieldparam [Object] old_value the starting value of the atomic reference
         
     | 
| 
       35 
     | 
    
         
            -
                #
         
     | 
| 
       36 
     | 
    
         
            -
                # @note This method was altered to avoid raising an exception by default.
         
     | 
| 
       37 
     | 
    
         
            -
                # Instead, this method now returns `nil` in case of failure. For more info,
         
     | 
| 
       38 
     | 
    
         
            -
                # please see: https://github.com/ruby-concurrency/concurrent-ruby/pull/336
         
     | 
| 
       39 
     | 
    
         
            -
                #
         
     | 
| 
       40 
     | 
    
         
            -
                # @return [Object] the new value, or nil if update failed
         
     | 
| 
       41 
     | 
    
         
            -
                def try_update
         
     | 
| 
       42 
     | 
    
         
            -
                  old_value = get
         
     | 
| 
       43 
     | 
    
         
            -
                  new_value = yield old_value
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                  return unless compare_and_set old_value, new_value
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
                  new_value
         
     | 
| 
       48 
     | 
    
         
            -
                end
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                # @!macro [attach] atomic_reference_method_try_update!
         
     | 
| 
       51 
     | 
    
         
            -
                #
         
     | 
| 
       52 
     | 
    
         
            -
                # Pass the current value to the given block, replacing it
         
     | 
| 
       53 
     | 
    
         
            -
                # with the block's result. Raise an exception if the update
         
     | 
| 
       54 
     | 
    
         
            -
                # fails.
         
     | 
| 
       55 
     | 
    
         
            -
                #
         
     | 
| 
       56 
     | 
    
         
            -
                # @yield [Object] Calculate a new value for the atomic reference using
         
     | 
| 
       57 
     | 
    
         
            -
                #   given (old) value
         
     | 
| 
       58 
     | 
    
         
            -
                # @yieldparam [Object] old_value the starting value of the atomic reference
         
     | 
| 
       59 
     | 
    
         
            -
                #
         
     | 
| 
       60 
     | 
    
         
            -
                # @note This behavior mimics the behavior of the original
         
     | 
| 
       61 
     | 
    
         
            -
                # `AtomicReference#try_update` API. The reason this was changed was to
         
     | 
| 
       62 
     | 
    
         
            -
                # avoid raising exceptions (which are inherently slow) by default. For more
         
     | 
| 
       63 
     | 
    
         
            -
                # info: https://github.com/ruby-concurrency/concurrent-ruby/pull/336
         
     | 
| 
       64 
     | 
    
         
            -
                #
         
     | 
| 
       65 
     | 
    
         
            -
                # @return [Object] the new value
         
     | 
| 
       66 
     | 
    
         
            -
                #
         
     | 
| 
       67 
     | 
    
         
            -
                # @raise [Concurrent::ConcurrentUpdateError] if the update fails
         
     | 
| 
       68 
     | 
    
         
            -
                def try_update!
         
     | 
| 
       69 
     | 
    
         
            -
                  old_value = get
         
     | 
| 
       70 
     | 
    
         
            -
                  new_value = yield old_value
         
     | 
| 
       71 
     | 
    
         
            -
                  unless compare_and_set(old_value, new_value)
         
     | 
| 
       72 
     | 
    
         
            -
                    if $VERBOSE
         
     | 
| 
       73 
     | 
    
         
            -
                      raise ConcurrentUpdateError, "Update failed"
         
     | 
| 
       74 
     | 
    
         
            -
                    else
         
     | 
| 
       75 
     | 
    
         
            -
                      raise ConcurrentUpdateError, "Update failed", ConcurrentUpdateError::CONC_UP_ERR_BACKTRACE
         
     | 
| 
       76 
     | 
    
         
            -
                    end
         
     | 
| 
       77 
     | 
    
         
            -
                  end
         
     | 
| 
       78 
     | 
    
         
            -
                  new_value
         
     | 
| 
       79 
     | 
    
         
            -
                end
         
     | 
| 
       80 
     | 
    
         
            -
              end
         
     | 
| 
       81 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,16 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'concurrent/synchronization'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            if defined?(Concurrent::JavaAtomicReference)
         
     | 
| 
       4 
     | 
    
         
            -
              require 'concurrent/atomic_reference/direct_update'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
              module Concurrent
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                # @!macro atomic_reference
         
     | 
| 
       9 
     | 
    
         
            -
                #
         
     | 
| 
       10 
     | 
    
         
            -
                # @!visibility private
         
     | 
| 
       11 
     | 
    
         
            -
                # @!macro internal_implementation_note
         
     | 
| 
       12 
     | 
    
         
            -
                class JavaAtomicReference
         
     | 
| 
       13 
     | 
    
         
            -
                  include Concurrent::AtomicDirectUpdate
         
     | 
| 
       14 
     | 
    
         
            -
                end
         
     | 
| 
       15 
     | 
    
         
            -
              end
         
     | 
| 
       16 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,22 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'concurrent/atomic_reference/direct_update'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'concurrent/atomic_reference/numeric_cas_wrapper'
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            module Concurrent
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
              # @!macro atomic_reference
         
     | 
| 
       7 
     | 
    
         
            -
              #
         
     | 
| 
       8 
     | 
    
         
            -
              # @note Extends `Rubinius::AtomicReference` version adding aliases
         
     | 
| 
       9 
     | 
    
         
            -
              #   and numeric logic.
         
     | 
| 
       10 
     | 
    
         
            -
              #
         
     | 
| 
       11 
     | 
    
         
            -
              # @!visibility private
         
     | 
| 
       12 
     | 
    
         
            -
              # @!macro internal_implementation_note
         
     | 
| 
       13 
     | 
    
         
            -
              class RbxAtomicReference < Rubinius::AtomicReference
         
     | 
| 
       14 
     | 
    
         
            -
                alias _compare_and_set compare_and_set
         
     | 
| 
       15 
     | 
    
         
            -
                include Concurrent::AtomicDirectUpdate
         
     | 
| 
       16 
     | 
    
         
            -
                include Concurrent::AtomicNumericCompareAndSetWrapper
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                alias_method :value, :get
         
     | 
| 
       19 
     | 
    
         
            -
                alias_method :value=, :set
         
     | 
| 
       20 
     | 
    
         
            -
                alias_method :swap, :get_and_set
         
     | 
| 
       21 
     | 
    
         
            -
              end
         
     | 
| 
       22 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,32 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            if defined? Concurrent::CAtomicReference
         
     | 
| 
       2 
     | 
    
         
            -
              require 'concurrent/synchronization'
         
     | 
| 
       3 
     | 
    
         
            -
              require 'concurrent/atomic_reference/direct_update'
         
     | 
| 
       4 
     | 
    
         
            -
              require 'concurrent/atomic_reference/numeric_cas_wrapper'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
              module Concurrent
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                # @!macro atomic_reference
         
     | 
| 
       9 
     | 
    
         
            -
                #
         
     | 
| 
       10 
     | 
    
         
            -
                # @!visibility private
         
     | 
| 
       11 
     | 
    
         
            -
                # @!macro internal_implementation_note
         
     | 
| 
       12 
     | 
    
         
            -
                class CAtomicReference
         
     | 
| 
       13 
     | 
    
         
            -
                  include Concurrent::AtomicDirectUpdate
         
     | 
| 
       14 
     | 
    
         
            -
                  include Concurrent::AtomicNumericCompareAndSetWrapper
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                  # @!method initialize
         
     | 
| 
       17 
     | 
    
         
            -
                  #   @!macro atomic_reference_method_initialize
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                  # @!method get
         
     | 
| 
       20 
     | 
    
         
            -
                  #   @!macro atomic_reference_method_get
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                  # @!method set
         
     | 
| 
       23 
     | 
    
         
            -
                  #   @!macro atomic_reference_method_set
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                  # @!method get_and_set
         
     | 
| 
       26 
     | 
    
         
            -
                  #   @!macro atomic_reference_method_get_and_set
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                  # @!method _compare_and_set
         
     | 
| 
       29 
     | 
    
         
            -
                  #   @!macro atomic_reference_method_compare_and_set
         
     | 
| 
       30 
     | 
    
         
            -
                end
         
     | 
| 
       31 
     | 
    
         
            -
              end
         
     | 
| 
       32 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/concurrent/edge.rb
    DELETED
    
    | 
         @@ -1,26 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Concurrent
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              # A submodule for unstable, highly experimental features that are likely to
         
     | 
| 
       4 
     | 
    
         
            -
              # change often and which may never become part of the core gem. Also for
         
     | 
| 
       5 
     | 
    
         
            -
              # new, experimental version of abstractions already in the core gem.
         
     | 
| 
       6 
     | 
    
         
            -
              #
         
     | 
| 
       7 
     | 
    
         
            -
              # Most new features should start in this module, clearly indicating the
         
     | 
| 
       8 
     | 
    
         
            -
              # experimental and unstable nature of the feature. Once a feature becomes
         
     | 
| 
       9 
     | 
    
         
            -
              # more stable and is a candidate for inclusion in the core gem it should
         
     | 
| 
       10 
     | 
    
         
            -
              # be moved up to the `Concurrent` module, where it would reside once merged
         
     | 
| 
       11 
     | 
    
         
            -
              # into the core gem.
         
     | 
| 
       12 
     | 
    
         
            -
              #
         
     | 
| 
       13 
     | 
    
         
            -
              # The only exception to this is for features which *replace* features from
         
     | 
| 
       14 
     | 
    
         
            -
              # the core gem in ways that are breaking and not backward compatible. These
         
     | 
| 
       15 
     | 
    
         
            -
              # features should remain in this module until merged into the core gem. This
         
     | 
| 
       16 
     | 
    
         
            -
              # will prevent namespace collisions.
         
     | 
| 
       17 
     | 
    
         
            -
              #
         
     | 
| 
       18 
     | 
    
         
            -
              # @!macro [attach] edge_warning
         
     | 
| 
       19 
     | 
    
         
            -
              #   @api Edge
         
     | 
| 
       20 
     | 
    
         
            -
              #   @note **Edge Feature:** Edge features are under active development and may change frequently. They are expected not to
         
     | 
| 
       21 
     | 
    
         
            -
              #     keep backward compatibility (there may also lack tests and documentation). Semantic versions will
         
     | 
| 
       22 
     | 
    
         
            -
              #     be obeyed though. Features developed in `concurrent-ruby-edge` are expected to move
         
     | 
| 
       23 
     | 
    
         
            -
              #     to `concurrent-ruby` when final.
         
     | 
| 
       24 
     | 
    
         
            -
              module Edge
         
     | 
| 
       25 
     | 
    
         
            -
              end
         
     | 
| 
       26 
     | 
    
         
            -
            end
         
     |