Sha256: b8092fab1445e6d11f71e26c665a3c52e8726ffe020a337105eaf81bf1c7b493

Contents?: true

Size: 803 Bytes

Versions: 3

Compression:

Stored size: 803 Bytes

Contents

require 'thread'
require 'timeout'

module EasyBunnyRPC
  class TimedQueue
    def initialize
      @array = Array.new
      @mutex = Mutex.new
      @cv = ConditionVariable.new
    end

    def push(item)
      @mutex.synchronize do
        @array.push(item)
        @cv.signal
      end
    end

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

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
easy_bunny_rpc-0.1.3 lib/easy_bunny_rpc/timed_queue.rb
easy_bunny_rpc-0.1.2 lib/easy_bunny_rpc/timed_queue.rb
easy_bunny_rpc-0.1.1 lib/easy_bunny_rpc/timed_queue.rb