Class: PerfectQueue::SignalQueue

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

Overview

SignalQueue is obsolete because it does not run with ruby >= 2.0.0. See ddbf04c9 and use SignalThread instead.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(&block) ⇒ SignalQueue

Returns a new instance of SignalQueue.



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/perfectqueue/signal_queue.rb', line 30

def initialize(&block)
  require 'thread'

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

  block.call(self) if block
end

Class Method Details

.start(&block) ⇒ Object



24
25
26
27
28
# File 'lib/perfectqueue/signal_queue.rb', line 24

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

Instance Method Details

#joinObject



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

def join
  @thread.join
end

#runObject



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/perfectqueue/signal_queue.rb', line 78

def run
  @owner_thread = Thread.current
  until @finished
    h = nil
    @mutex.synchronize do
      while @queue.empty?
        @cond.wait(@mutex, 0.5)
      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



73
74
75
76
# File 'lib/perfectqueue/signal_queue.rb', line 73

def shutdown
  stop
  join
end

#startObject



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

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

#stopObject



68
69
70
71
# File 'lib/perfectqueue/signal_queue.rb', line 68

def stop
  @finished = true
  enqueue(nil)  # TODO causes recursive lock?
end

#trap(sig, command = nil, &block) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/perfectqueue/signal_queue.rb', line 42

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

  if block
    Kernel.trap(sig) do
      enqueue(sig)
    end
    @handlers[sig] = block

  else
    Kernel.trap(sig, command)
    @handlers.delete(sig)
  end

  old
end