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