class Concurrent::Collection::RubyTimeoutQueue

@!visibility private @!macro ruby_timeout_queue

Public Class Methods

new(*args) click to toggle source
Calls superclass method
# 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

Public Instance Methods

<<(obj)
Alias for: push
deq(non_block = false, timeout: nil)
Alias for: pop
enq(obj)
Alias for: push
pop(non_block = false, timeout: nil) click to toggle source
Calls superclass method
# 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
Also aliased as: deq, shift
push(obj) click to toggle source
Calls superclass method
# 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
Also aliased as: enq, <<
shift(non_block = false, timeout: nil)
Alias for: pop