123456789_123456789_123456789_123456789_123456789_

Class: Concurrent::Promises::ZipFuturesPromise

Constant Summary

InternalStates - Included

PENDING, RESERVED, RESOLVED

Class Attribute Summary

Class Method Summary

BlockedPromise - Inherited

AbstractPromise - Inherited

Synchronization::Object - Inherited

.atomic_attribute?, .atomic_attributes,
.attr_atomic

Creates methods for reading and writing to a instance variable with volatile (Java) semantic as .attr_volatile does.

.attr_volatile

Creates methods for reading and writing (as attr_accessor does) to a instance variable with volatile (Java) semantic.

.ensure_safe_initialization_when_final_fields_are_present

For testing purposes, quite slow.

.new

Has to be called by children.

.safe_initialization!, .define_initialize_atomic_fields

Synchronization::AbstractObject - Inherited

Instance Method Summary

Constructor Details

.new(delayed, blockers_count, default_executor) ⇒ ZipFuturesPromise (private)

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/promises.rb', line 2000

def initialize(delayed, blockers_count, default_executor)
  super(delayed, blockers_count, Future.new(self, default_executor))
  @Resolutions = ::Array.new(blockers_count, nil)

  on_resolvable nil, nil if blockers_count == 0
end

Instance Method Details

#on_resolvable(resolved_future, index) (private)

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/promises.rb', line 2013

def on_resolvable(resolved_future, index)
  all_fulfilled = true
  values        = ::Array.new(@Resolutions.size)
  reasons       = ::Array.new(@Resolutions.size)

  @Resolutions.each_with_index do |internal_state, i|
    fulfilled, values[i], reasons[i] = internal_state.result
    all_fulfilled                    &&= fulfilled
  end

  if all_fulfilled
    resolve_with FulfilledArray.new(values)
  else
    resolve_with PartiallyRejected.new(values, reasons)
  end
end

#process_on_blocker_resolution(future, index) (private)

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/promises.rb', line 2007

def process_on_blocker_resolution(future, index)
  # TODO (pitr-ch 18-Dec-2016): Can we assume that array will never break under parallel access when never re-sized?
  @Resolutions[index] = future.internal_state # has to be set before countdown in super
  super future, index
end