concurrent-ruby 1.1.4 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/Gemfile +9 -7
- data/README.md +34 -2
- data/Rakefile +33 -52
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java +9 -8
- data/lib/concurrent/array.rb +3 -3
- data/lib/concurrent/async.rb +14 -0
- data/lib/concurrent/atomic/atomic_fixnum.rb +2 -2
- data/lib/concurrent/collection/lock_free_stack.rb +1 -1
- data/lib/concurrent/concurrent_ruby.jar +0 -0
- data/lib/concurrent/executor/timer_set.rb +13 -15
- data/lib/concurrent/hash.rb +3 -3
- data/lib/concurrent/promises.rb +348 -117
- data/lib/concurrent/synchronization/abstract_struct.rb +1 -0
- data/lib/concurrent/synchronization/condition.rb +2 -0
- data/lib/concurrent/synchronization/jruby_object.rb +1 -0
- data/lib/concurrent/synchronization/lock.rb +2 -0
- data/lib/concurrent/synchronization/mri_object.rb +1 -0
- data/lib/concurrent/synchronization/object.rb +46 -20
- data/lib/concurrent/synchronization/rbx_object.rb +1 -0
- data/lib/concurrent/synchronization/truffleruby_object.rb +1 -0
- data/lib/concurrent/version.rb +1 -2
- metadata +5 -4
| @@ -27,15 +27,15 @@ module Concurrent | |
| 27 27 |  | 
| 28 28 | 
             
                  # @!method self.attr_volatile(*names)
         | 
| 29 29 | 
             
                  #   Creates methods for reading and writing (as `attr_accessor` does) to a instance variable with
         | 
| 30 | 
            -
                  #   volatile (Java) semantic. The instance variable should be accessed  | 
| 30 | 
            +
                  #   volatile (Java) semantic. The instance variable should be accessed only through generated methods.
         | 
| 31 31 | 
             
                  #
         | 
| 32 | 
            -
                  #   @param [Array<Symbol>] names of the instance variables to be volatile
         | 
| 33 | 
            -
                  #   @return [Array<Symbol>] names of defined method names
         | 
| 32 | 
            +
                  #   @param [::Array<Symbol>] names of the instance variables to be volatile
         | 
| 33 | 
            +
                  #   @return [::Array<Symbol>] names of defined method names
         | 
| 34 34 |  | 
| 35 35 | 
             
                  # Has to be called by children.
         | 
| 36 36 | 
             
                  def initialize
         | 
| 37 37 | 
             
                    super
         | 
| 38 | 
            -
                     | 
| 38 | 
            +
                    __initialize_atomic_fields__
         | 
| 39 39 | 
             
                  end
         | 
| 40 40 |  | 
| 41 41 | 
             
                  # By calling this method on a class, it and all its children are marked to be constructed safely. Meaning that
         | 
| @@ -49,10 +49,12 @@ module Concurrent | |
| 49 49 | 
             
                  #       @AFinalValue = 'value' # published safely, does not have to be synchronized
         | 
| 50 50 | 
             
                  #     end
         | 
| 51 51 | 
             
                  #   end
         | 
| 52 | 
            +
                  # @return [true]
         | 
| 52 53 | 
             
                  def self.safe_initialization!
         | 
| 53 54 | 
             
                    # define only once, and not again in children
         | 
| 54 55 | 
             
                    return if safe_initialization?
         | 
| 55 56 |  | 
| 57 | 
            +
                    # @!visibility private
         | 
| 56 58 | 
             
                    def self.new(*args, &block)
         | 
| 57 59 | 
             
                      object = super(*args, &block)
         | 
| 58 60 | 
             
                    ensure
         | 
| @@ -70,6 +72,8 @@ module Concurrent | |
| 70 72 |  | 
| 71 73 | 
             
                  # For testing purposes, quite slow. Injects assert code to new method which will raise if class instance contains
         | 
| 72 74 | 
             
                  # any instance variables with CamelCase names and isn't {.safe_initialization?}.
         | 
| 75 | 
            +
                  # @raise when offend found
         | 
| 76 | 
            +
                  # @return [true]
         | 
| 73 77 | 
             
                  def self.ensure_safe_initialization_when_final_fields_are_present
         | 
| 74 78 | 
             
                    Object.class_eval do
         | 
| 75 79 | 
             
                      def self.new(*args, &block)
         | 
| @@ -81,6 +85,7 @@ module Concurrent | |
| 81 85 | 
             
                        end
         | 
| 82 86 | 
             
                      end
         | 
| 83 87 | 
             
                    end
         | 
| 88 | 
            +
                    true
         | 
| 84 89 | 
             
                  end
         | 
| 85 90 |  | 
| 86 91 | 
             
                  # Creates methods for reading and writing to a instance variable with
         | 
| @@ -89,13 +94,30 @@ module Concurrent | |
| 89 94 | 
             
                  # This method generates following methods: `value`, `value=(new_value) #=> new_value`,
         | 
| 90 95 | 
             
                  # `swap_value(new_value) #=> old_value`,
         | 
| 91 96 | 
             
                  # `compare_and_set_value(expected, value) #=> true || false`, `update_value(&block)`.
         | 
| 92 | 
            -
                  # @param [Array<Symbol>] names of the instance variables to be volatile with CAS.
         | 
| 93 | 
            -
                  # @return [Array<Symbol>] names of defined method names.
         | 
| 97 | 
            +
                  # @param [::Array<Symbol>] names of the instance variables to be volatile with CAS.
         | 
| 98 | 
            +
                  # @return [::Array<Symbol>] names of defined method names.
         | 
| 99 | 
            +
                  # @!macro attr_atomic
         | 
| 100 | 
            +
                  #   @!method $1
         | 
| 101 | 
            +
                  #     @return [Object] The $1.
         | 
| 102 | 
            +
                  #   @!method $1=(new_$1)
         | 
| 103 | 
            +
                  #     Set the $1.
         | 
| 104 | 
            +
                  #     @return [Object] new_$1.
         | 
| 105 | 
            +
                  #   @!method swap_$1(new_$1)
         | 
| 106 | 
            +
                  #     Set the $1 to new_$1 and return the old $1.
         | 
| 107 | 
            +
                  #     @return [Object] old $1
         | 
| 108 | 
            +
                  #   @!method compare_and_set_$1(expected_$1, new_$1)
         | 
| 109 | 
            +
                  #     Sets the $1 to new_$1 if the current $1 is expected_$1
         | 
| 110 | 
            +
                  #     @return [true, false]
         | 
| 111 | 
            +
                  #   @!method update_$1(&block)
         | 
| 112 | 
            +
                  #     Updates the $1 using the block.
         | 
| 113 | 
            +
                  #     @yield [Object] Calculate a new $1 using given (old) $1
         | 
| 114 | 
            +
                  #     @yieldparam [Object] old $1
         | 
| 115 | 
            +
                  #     @return [Object] new $1
         | 
| 94 116 | 
             
                  def self.attr_atomic(*names)
         | 
| 95 | 
            -
                    @ | 
| 96 | 
            -
                    @ | 
| 117 | 
            +
                    @__atomic_fields__ ||= []
         | 
| 118 | 
            +
                    @__atomic_fields__ += names
         | 
| 97 119 | 
             
                    safe_initialization!
         | 
| 98 | 
            -
                     | 
| 120 | 
            +
                    define_initialize_atomic_fields
         | 
| 99 121 |  | 
| 100 122 | 
             
                    names.each do |name|
         | 
| 101 123 | 
             
                      ivar = :"@Atomic#{name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }}"
         | 
| @@ -124,32 +146,36 @@ module Concurrent | |
| 124 146 | 
             
                    names.flat_map { |n| [n, :"#{n}=", :"swap_#{n}", :"compare_and_set_#{n}", :"update_#{n}"] }
         | 
| 125 147 | 
             
                  end
         | 
| 126 148 |  | 
| 127 | 
            -
                  # @param [true,false] inherited should inherited volatile with CAS fields be returned?
         | 
| 128 | 
            -
                  # @return [Array<Symbol>] Returns defined volatile with CAS fields on this class.
         | 
| 129 | 
            -
                  def self. | 
| 130 | 
            -
                    @ | 
| 131 | 
            -
                    ((superclass. | 
| 132 | 
            -
             | 
| 149 | 
            +
                  # @param [true, false] inherited should inherited volatile with CAS fields be returned?
         | 
| 150 | 
            +
                  # @return [::Array<Symbol>] Returns defined volatile with CAS fields on this class.
         | 
| 151 | 
            +
                  def self.atomic_attributes(inherited = true)
         | 
| 152 | 
            +
                    @__atomic_fields__ ||= []
         | 
| 153 | 
            +
                    ((superclass.atomic_attributes if superclass.respond_to?(:atomic_attributes) && inherited) || []) + @__atomic_fields__
         | 
| 154 | 
            +
                  end
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                  # @return [true, false] is the attribute with name atomic?
         | 
| 157 | 
            +
                  def self.atomic_attribute?(name)
         | 
| 158 | 
            +
                    atomic_attributes.include? name
         | 
| 133 159 | 
             
                  end
         | 
| 134 160 |  | 
| 135 161 | 
             
                  private
         | 
| 136 162 |  | 
| 137 | 
            -
                  def self. | 
| 138 | 
            -
                    assignments = @ | 
| 163 | 
            +
                  def self.define_initialize_atomic_fields
         | 
| 164 | 
            +
                    assignments = @__atomic_fields__.map do |name|
         | 
| 139 165 | 
             
                      "@Atomic#{name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }} = Concurrent::AtomicReference.new(nil)"
         | 
| 140 166 | 
             
                    end.join("\n")
         | 
| 141 167 |  | 
| 142 168 | 
             
                    class_eval <<-RUBY, __FILE__, __LINE__ + 1
         | 
| 143 | 
            -
                      def  | 
| 169 | 
            +
                      def __initialize_atomic_fields__
         | 
| 144 170 | 
             
                        super
         | 
| 145 171 | 
             
                        #{assignments}
         | 
| 146 172 | 
             
                      end
         | 
| 147 173 | 
             
                    RUBY
         | 
| 148 174 | 
             
                  end
         | 
| 149 175 |  | 
| 150 | 
            -
                  private_class_method : | 
| 176 | 
            +
                  private_class_method :define_initialize_atomic_fields
         | 
| 151 177 |  | 
| 152 | 
            -
                  def  | 
| 178 | 
            +
                  def __initialize_atomic_fields__
         | 
| 153 179 | 
             
                  end
         | 
| 154 180 |  | 
| 155 181 | 
             
                end
         | 
    
        data/lib/concurrent/version.rb
    CHANGED
    
    
    
        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.1. | 
| 4 | 
            +
              version: 1.1.5
         | 
| 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: 2019-03-11 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.
         | 
| @@ -167,7 +167,8 @@ files: | |
| 167 167 | 
             
            homepage: http://www.concurrent-ruby.com
         | 
| 168 168 | 
             
            licenses:
         | 
| 169 169 | 
             
            - MIT
         | 
| 170 | 
            -
            metadata: | 
| 170 | 
            +
            metadata:
         | 
| 171 | 
            +
              source_code_uri: https://github.com/ruby-concurrency/concurrent-ruby
         | 
| 171 172 | 
             
            post_install_message: 
         | 
| 172 173 | 
             
            rdoc_options: []
         | 
| 173 174 | 
             
            require_paths:
         | 
| @@ -184,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 184 185 | 
             
                  version: '0'
         | 
| 185 186 | 
             
            requirements: []
         | 
| 186 187 | 
             
            rubyforge_project: 
         | 
| 187 | 
            -
            rubygems_version: 2.7. | 
| 188 | 
            +
            rubygems_version: 2.7.8
         | 
| 188 189 | 
             
            signing_key: 
         | 
| 189 190 | 
             
            specification_version: 4
         | 
| 190 191 | 
             
            summary: Modern concurrency tools for Ruby. Inspired by Erlang, Clojure, Scala, Haskell,
         |