class Rbgo::Semaphore

Public Class Methods

new(count) click to toggle source
# File lib/rbgo/semaphore.rb, line 3
def initialize(count)
  count = count.to_i
  raise 'count must be positive' if count <= 0
  @mutex = Mutex.new
  @cond  = ConditionVariable.new
  @count = count
end

Public Instance Methods

acquire(permits = 1) { || ... } click to toggle source
# File lib/rbgo/semaphore.rb, line 17
def acquire(permits = 1)
  raise 'Must be called with a block' unless block_given?

  begin
   ok = _acquire(permits)
    yield
  ensure
    release(permits) if ok
  end
end
acquire_all() { || ... } click to toggle source
# File lib/rbgo/semaphore.rb, line 28
def acquire_all
  raise 'Must be called with a block' unless block_given?

  begin
    permits = drain_permits
    yield
  ensure
    release(permits)
  end
end
available_permits() click to toggle source
# File lib/rbgo/semaphore.rb, line 11
def available_permits
  @mutex.synchronize do
    return @count
  end
end
release(permits = 1) click to toggle source
# File lib/rbgo/semaphore.rb, line 51
def release(permits = 1)
  permits = permits.to_i
  raise 'permits must be positive' if permits <= 0
  @mutex.synchronize do
    @count += permits
    @cond.broadcast
  end
  self
end
try_acquire(permits = 1) { || ... } click to toggle source
# File lib/rbgo/semaphore.rb, line 39
def try_acquire(permits = 1)
  raise 'Must be called with a block' unless block_given?

  begin
    ok = _try_acquire(permits)
    yield if ok
  ensure
    release(permits) if ok
  end
  return ok
end

Private Instance Methods

_acquire(permits = 1) click to toggle source
# File lib/rbgo/semaphore.rb, line 63
def _acquire(permits = 1)
  permits = permits.to_i
  raise 'permits must be positive' if permits <= 0
  @mutex.synchronize do
    while @count - permits < 0
      @cond.wait(@mutex)
    end
    @count -= permits
    return self
  end
end
_try_acquire(permits = 1) click to toggle source
# File lib/rbgo/semaphore.rb, line 86
def _try_acquire(permits = 1)
  permits = permits.to_i
  raise 'permits must be positive' if permits <= 0
  @mutex.synchronize do
    if @count - permits < 0
      return false
    else
      @count -= permits
      return true
    end
  end
end
drain_permits() click to toggle source
# File lib/rbgo/semaphore.rb, line 75
def drain_permits
  @mutex.synchronize do
    while @count <= 0
      @cond.wait(@mutex)
    end
    tmp_count = @count
    @count = 0
    return tmp_count
  end
end