class Sqreen::Kit::Signals::BatchCollector::QueueWithTimeout
Adapted from spin.atomicobject.com/2014/07/07/ruby-queue-pop-timeout/
Constants
- MAX_QUEUE_SIZE
Public Class Methods
new()
click to toggle source
# File lib/sqreen/kit/signals/batch_collector.rb, line 135 def initialize @mutex = Mutex.new @queue = [] @received = ConditionVariable.new end
Public Instance Methods
<<(x)
click to toggle source
# File lib/sqreen/kit/signals/batch_collector.rb, line 141 def <<(x) @mutex.synchronize do if @queue.size >= MAX_QUEUE_SIZE # processing loop is prob spending too much time on http requests logger.warn "Queue is full! Dropping #{x}" next end @queue << x @received.signal end end
pop(deadline = nil)
click to toggle source
@param deadline [Float]
# File lib/sqreen/kit/signals/batch_collector.rb, line 162 def pop(deadline = nil) @mutex.synchronize do if deadline.nil? # wait indefinitely until there is an element in the queue @received.wait(@mutex) while @queue.empty? elsif @queue.empty? # wait for element or timeout while @queue.empty? && (remaining_time = deadline - Time.now.to_f) > 0 @received.wait(@mutex, remaining_time) end end return nil if @queue.empty? @queue.shift end end
pop_nb()
click to toggle source
non-blocking pop
# File lib/sqreen/kit/signals/batch_collector.rb, line 154 def pop_nb @mutex.synchronize do return nil if @queue.empty? @queue.shift end end