class Knj::Mutexcl
Public Class Methods
new(args = {})
click to toggle source
# File lib/knj/mutexcl.rb, line 2 def initialize(args = {}) @args = args raise "No ':modes' given in arguments." if !@args.key?(:modes) @mutex = Mutex.new @blocked = {} @args[:modes].each do |mode, data| data[:blocks].each do |block| @blocked[block] = { :mutex => Mutex.new, :count => 0 } end end end
rw()
click to toggle source
# File lib/knj/mutexcl.rb, line 17 def self.rw return Knj::Mutexcl.new( :modes => { :reader => {:blocks => [:writer]}, :writer => {:blocks => [:writer, :reader]} } ) end
Public Instance Methods
sync(mode) { || ... }
click to toggle source
# File lib/knj/mutexcl.rb, line 26 def sync(mode) raise "No such mode: '#{mode}'." if !@args[:modes].key?(mode) while @blocked[mode][:count].to_i > 0 STDOUT.print "Sleeping because blocked '#{mode}' (#{@blocked[mode][:count]}).\n" sleep 0.1 end @mutex.synchronize do @args[:modes][mode][:blocks].each do |block| @blocked[block][:count] += 1 end end begin yield ensure @args[:modes][mode][:blocks].each do |block| @blocked[block][:count] -= 1 end end end