Sha256: 522fc8a694c9c345258bd14ce9b0fdcfa433997334d39dcbea3d05d61a3a88e9

Contents?: true

Size: 1.05 KB

Versions: 102

Compression:

Stored size: 1.05 KB

Contents

class Knj::Mutexcl
  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
  
  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].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

102 entries across 102 versions & 1 rubygems

Version Path
knjrbfw-0.0.49 lib/knj/mutexcl.rb
knjrbfw-0.0.48 lib/knj/mutexcl.rb
knjrbfw-0.0.47 lib/knj/mutexcl.rb
knjrbfw-0.0.46 lib/knj/mutexcl.rb
knjrbfw-0.0.45 lib/knj/mutexcl.rb
knjrbfw-0.0.44 lib/knj/mutexcl.rb
knjrbfw-0.0.43 lib/knj/mutexcl.rb
knjrbfw-0.0.42 lib/knj/mutexcl.rb
knjrbfw-0.0.41 lib/knj/mutexcl.rb
knjrbfw-0.0.40 lib/knj/mutexcl.rb
knjrbfw-0.0.39 lib/knj/mutexcl.rb
knjrbfw-0.0.38 lib/knj/mutexcl.rb
knjrbfw-0.0.37 lib/knj/mutexcl.rb
knjrbfw-0.0.36 lib/knj/mutexcl.rb
knjrbfw-0.0.35 lib/knj/mutexcl.rb
knjrbfw-0.0.34 lib/knj/mutexcl.rb
knjrbfw-0.0.33 lib/knj/mutexcl.rb
knjrbfw-0.0.32 lib/knj/mutexcl.rb
knjrbfw-0.0.31 lib/knj/mutexcl.rb
knjrbfw-0.0.30 lib/knj/mutexcl.rb