class Upfluence::Utils::Semaphore

Public Class Methods

new(size) click to toggle source
# File lib/upfluence/utils/semaphore.rb, line 4
def initialize(size)
  @size = size
  @used = 0
  @mutex = Mutex.new
  @cond = ConditionVariable.new
end

Public Instance Methods

acquire(count = 1) click to toggle source
# File lib/upfluence/utils/semaphore.rb, line 11
def acquire(count = 1)
  @mutex.synchronize do
    loop do
      break if @used + count <= @size

      @cond.wait(@mutex)
    end

    @used += count
  end
end
release(count = 1) click to toggle source
# File lib/upfluence/utils/semaphore.rb, line 23
def release(count = 1)
  @mutex.synchronize do
    @used -= count
    @cond.broadcast
  end
end
synchronize(count = 1, &block) click to toggle source
# File lib/upfluence/utils/semaphore.rb, line 30
def synchronize(count = 1, &block)
  acquire(count)
  block.call
ensure
  release(count)
end