Class: PerfectQueue::SignalQueue

Inherits:
Object
  • Object
show all
Defined in:
lib/perfectqueue/signal_queue.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(&block) ⇒ SignalQueue

Returns a new instance of SignalQueue.



28
29
30
31
32
33
34
35
36
37
# File 'lib/perfectqueue/signal_queue.rb', line 28

def initialize(&block)
  require 'thread'

  @handlers = {}
  @queue = []
  @mutex = Mutex.new
  @cond = ConditionVariable.new

  block.call(self) if block
end

Class Method Details

.start(&block) ⇒ Object



22
23
24
25
26
# File 'lib/perfectqueue/signal_queue.rb', line 22

def self.start(&block)
  st = new(&block)
  st.start
  return st
end

Instance Method Details

#joinObject



55
56
57
# File 'lib/perfectqueue/signal_queue.rb', line 55

def join
  @thread.join
end

#runObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/perfectqueue/signal_queue.rb', line 68

def run
  finished = false
  until finished
    h = nil
    @mutex.synchronize do
      while @queue.empty?
        @cond.wait(@mutex)
      end
      sig = @queue.shift
      if sig == nil
        finished = true
      else
        h = @handlers[sig]
      end
    end

    begin
      h.call if h
    rescue
      STDERR.print "#{$!}\n"
      $!.backtrace.each {|bt|
        STDERR.print "\t#{bt}\n"
        STDERR.flush
      }
    end
  end
end

#shutdownObject



63
64
65
66
# File 'lib/perfectqueue/signal_queue.rb', line 63

def shutdown
  stop
  join
end

#startObject



51
52
53
# File 'lib/perfectqueue/signal_queue.rb', line 51

def start
  @thread = Thread.new(&method(:run))
end

#stopObject



59
60
61
# File 'lib/perfectqueue/signal_queue.rb', line 59

def stop
  enqueue(nil)
end

#trap(sig, &block) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
# File 'lib/perfectqueue/signal_queue.rb', line 39

def trap(sig, &block)
  sig = sig.to_sym
  old = @handlers[sig]

  Kernel.trap(sig) do
    enqueue(sig)
  end

  @handlers[sig] = block
  old
end