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