Sha256: 253b080c3f4e91aa19a1e29f47213143ed6bce4872e23154ccb990e3986dec8d
Contents?: true
Size: 1.06 KB
Versions: 1
Compression:
Stored size: 1.06 KB
Contents
class Knj::Mutexcl def initialize(args = {}) @args = args raise "No ':modes' given in arguments." if !@args.has_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 def self.rw return Knj::Mutexcl.new( :modes => { :reader => {:blocks => [:writer]}, :writer => {:blocks => [:writer, :reader]} } ) end def sync(mode) raise "No such mode: '#{mode}'." if !@args[:modes].has_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 end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
knjrbfw-0.0.7 | lib/knj/mutexcl.rb |