123456789_123456789_123456789_123456789_123456789_

Class: Concurrent::Collection::RubyTimeoutQueue

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Queue
Instance Chain:
self, Queue
Inherits: Queue
  • ::Object
Defined in: lib/concurrent-ruby/concurrent/collection/ruby_timeout_queue.rb

Class Method Summary

Instance Method Summary

Constructor Details

.new(*args) ⇒ RubyTimeoutQueue

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/collection/ruby_timeout_queue.rb', line 6

def initialize(*args)
  if RUBY_VERSION >= '3.2'
    raise "#{self.class.name} is not needed on Ruby 3.2 or later, use ::Queue instead"
  end

  super(*args)

  @mutex = Mutex.new
  @cond_var = ConditionVariable.new
end

Instance Method Details

#<<(obj)

Alias for #push.

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/collection/ruby_timeout_queue.rb', line 24

alias_method :<<, :push

#deq(non_block = false, timeout: nil)

Alias for #pop.

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/collection/ruby_timeout_queue.rb', line 50

alias_method :deq, :pop

#enq(obj)

Alias for #push.

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/collection/ruby_timeout_queue.rb', line 23

alias_method :enq, :push

#pop(non_block = false, timeout: nil) Also known as: #deq, #shift

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/collection/ruby_timeout_queue.rb', line 26

def pop(non_block = false, timeout: nil)
  if non_block && timeout
    raise ArgumentError, "can't set a timeout if non_block is enabled"
  end

  if non_block
    super(true)
  elsif timeout
    @mutex.synchronize do
      deadline = Concurrent.monotonic_time + timeout
      while (now = Concurrent.monotonic_time) < deadline && empty?
        @cond_var.wait(@mutex, deadline - now)
      end
      begin
        return super(true)
      rescue ThreadError
        # still empty
        nil
      end
    end
  else
    super(false)
  end
end

#push(obj) Also known as: #enq, #<<

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/collection/ruby_timeout_queue.rb', line 17

def push(obj)
  @mutex.synchronize do
    super(obj)
    @cond_var.signal
  end
end

#shift(non_block = false, timeout: nil)

Alias for #pop.

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/collection/ruby_timeout_queue.rb', line 51

alias_method :shift, :pop