Module: RbbtSemaphore

Defined in:
lib/rbbt/util/semaphore.rb

Class Method Summary collapse

Class Method Details

.fork_each_on_semaphore(elems, size, file = nil) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/rbbt/util/semaphore.rb', line 64

def self.fork_each_on_semaphore(elems, size, file = nil)
  with_semaphore(size, file) do |file|
    begin
      pids = elems.collect do |elem| 
        Process.fork do 
          begin
            RbbtSemaphore.wait_semaphore(file)
            begin
              yield elem
            ensure
              RbbtSemaphore.post_semaphore(file)
            end
          rescue Interrupt
            Log.error "Process #{Process.pid} was aborted"
          end
        end
      end
      pids.each do |pid| Process.waitpid pid end
    rescue Exception
      Log.error "Killing children: #{pids.sort * ", " }"
      pids.each do |pid| begin Process.kill("INT", pid); rescue; end; end
      pids.each do |pid| begin RbbtSemaphore.post_semaphore(file); rescue; end; end
      Log.error "Ensuring children are dead: #{pids.sort * ", " }"
      pids.each do |pid| begin Process.waitpid pid; rescue; end; end
    end
  end
end

.with_semaphore(size, file = nil) ⇒ Object



53
54
55
56
57
58
59
60
61
62
# File 'lib/rbbt/util/semaphore.rb', line 53

def self.with_semaphore(size, file = nil)
  file = Misc.digest(rand.to_s) if file.nil?
  file.gsub!('/', '_')
  begin
    RbbtSemaphore.create_semaphore(file, size)
    yield file
  ensure
    RbbtSemaphore.delete_semaphore(file)
  end
end