class EasyBunnyRPC::TimedQueue

Public Class Methods

new() click to toggle source
# File lib/easy_bunny_rpc/timed_queue.rb, line 6
def initialize
  @array = Array.new
  @mutex = Mutex.new
  @cv = ConditionVariable.new
end

Public Instance Methods

pop_with_timeout(timeout=0.5) click to toggle source
# File lib/easy_bunny_rpc/timed_queue.rb, line 19
def pop_with_timeout(timeout=0.5)
  timeout_at = Time.now + timeout

  @mutex.synchronize do
    loop do
      if @array.empty?
        remaining = timeout_at - Time.now

        raise(Timeout::Error, "Waited #{timeout} seconds to pop") if(remaining <= 0)

        # unlocks mutex, waits for remaining seconds, locks mutex on wake-up
        @cv.wait(@mutex, remaining)
      else
        return @array.pop
      end
    end
  end
end
push(item) click to toggle source
# File lib/easy_bunny_rpc/timed_queue.rb, line 12
def push(item)
  @mutex.synchronize do
    @array.push(item)
    @cv.signal
  end
end