class MutexPool

Attributes

size[R]

Public Class Methods

new(size = 1) click to toggle source
# File lib/queueing_rabbit/misc/mutex_pool.rb, line 4
def initialize(size = 1)
  @pool = Queue.new
  @size = size
  @pop_mutex = Mutex.new
  @lock_mutex = Mutex.new
  @locked_pool = []
  @size.times { @pool << Mutex.new }
end

Public Instance Methods

lock() click to toggle source
# File lib/queueing_rabbit/misc/mutex_pool.rb, line 20
def lock
  @lock_mutex.lock
  @pop_mutex.lock
  @locked_pool = @size.times.map { |i| @pool.pop }
end
synchronize(&block) click to toggle source
# File lib/queueing_rabbit/misc/mutex_pool.rb, line 13
def synchronize(&block)
  mutex = @pop_mutex.synchronize { @pool.pop }
  mutex.synchronize(&block)
ensure
  @pool << mutex if mutex
end
unlock() click to toggle source
# File lib/queueing_rabbit/misc/mutex_pool.rb, line 26
def unlock
  raise ThreadError, 'The pool is not locked' unless @lock_mutex.locked?
  @locked_pool.each { |m| @pool << m }
  @locked_pool = []
  @pop_mutex.unlock
  @lock_mutex.unlock
end