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
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
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