class Mongo::DistinguishingSemaphore

This is a semaphore that distinguishes waits ending due to the timeout being reached from waits ending due to the semaphore being signaled.

@api private

Public Class Methods

new() click to toggle source
# File lib/mongo/distinguishing_semaphore.rb, line 24
def initialize
  @lock = Mutex.new
  @cv = ::ConditionVariable.new
  @queue = []
end

Public Instance Methods

broadcast() click to toggle source
# File lib/mongo/distinguishing_semaphore.rb, line 44
def broadcast
  @lock.synchronize do
    @queue.push(true)
    @cv.broadcast
  end
end
signal() click to toggle source
# File lib/mongo/distinguishing_semaphore.rb, line 51
def signal
  @lock.synchronize do
    @queue.push(true)
    @cv.signal
  end
end
wait(timeout = nil) click to toggle source

Waits for the semaphore to be signaled up to timeout seconds. If semaphore is not signaled, returns after timeout seconds.

@return [ true | false ] true if semaphore was signaled, false if

timeout was reached.
# File lib/mongo/distinguishing_semaphore.rb, line 35
def wait(timeout = nil)
  @lock.synchronize do
    @cv.wait(@lock, timeout)
    (!@queue.empty?).tap do
      @queue.clear
    end
  end
end