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