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