class Mongoid::Sessions::SessionPool::Queue

Public Class Methods

new(lock=Monitor.new) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 7
def initialize(lock=Monitor.new)
  @lock = lock
  @cond = @lock.new_cond
  @num_waiting = 0
  @queue = []
end

Public Instance Methods

add(session) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 26
def add(session)
  synchronize do
    @queue.push session
    @cond.signal
  end
end
any_waiting?() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 14
def any_waiting?
  synchronize do
    @num_waiting > 0
  end
end
count() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 49
def count
  @queue.count
end
num_waiting() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 20
def num_waiting
  synchronize do
    @num_waiting
  end
end
poll(timeout = nil) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 39
def poll(timeout = nil)
  synchronize do
    if timeout
      no_wait_poll || wait_poll(timeout)
    else
      no_wait_poll
    end
  end
end
remove() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 33
def remove
  synchronize do
    @queue.shift
  end
end

Private Instance Methods

any?() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 59
def any?
  !@queue.empty?
end
can_remove_no_wait?() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 63
def can_remove_no_wait?
  @queue.size > @num_waiting
end
no_wait_poll() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 67
def no_wait_poll
  remove if can_remove_no_wait?
end
synchronize(&block) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 55
def synchronize(&block)
  @lock.synchronize(&block)
end
wait_poll(timeout) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 71
def wait_poll(timeout)
  @num_waiting += 1

  t0 = Time.now
  elapsed = 0
  loop do
    @cond.wait(timeout - elapsed)

    return remove if any?

    elapsed = Time.now - t0
    if elapsed >= timeout
      msg = 'Timed out waiting for database session'
      raise ConnectionTimeoutError, msg
    end
  end
ensure
  @num_waiting -= 1
end