fix header test and add notice for event unavailability when using god binary
[god.git] / lib / god / event_handler.rb
blob3714ade85d71732baac0fb3acec8bce5ff990c7f
1 module God
2   class EventHandler
3     @@actions = {}
4     @@handler = nil
5     @@loaded = false
6     
7     def self.loaded?
8       @@loaded
9     end
10     
11     def self.load
12       begin
13         case RUBY_PLATFORM
14         when /darwin/i, /bsd/i
15           require 'god/event_handlers/kqueue_handler'
16           @@handler = KQueueHandler
17         when /linux/i
18           require 'god/event_handlers/netlink_handler'
19           @@handler = NetlinkHandler
20         else
21           raise NotImplementedError, "Platform not supported for EventHandler"
22         end
23         @@loaded = true
24       rescue
25         require 'god/event_handlers/dummy_handler'
26         @@handler = DummyHandler
27         @@loaded = false
28       end
29     end
30     
31     def self.register(pid, event, &block)
32       @@actions[pid] ||= {}
33       @@actions[pid][event] = block
34       @@handler.register_process(pid, @@actions[pid].keys)
35     end
36     
37     def self.deregister(pid, event=nil)
38       if watching_pid? pid
39         if event.nil?
40           @@actions.delete(pid)
41           @@handler.register_process(pid, []) if system("kill -0 #{pid} &> /dev/null")
42         else
43           @@actions[pid].delete(event)
44           @@handler.register_process(pid, @@actions[pid].keys) if system("kill -0 #{pid} &> /dev/null")
45         end
46       end
47     end
48     
49     def self.call(pid, event)
50       @@actions[pid][event].call if watching_pid?(pid) && @@actions[pid][event]
51     end
52     
53     def self.watching_pid?(pid)
54       @@actions[pid]
55     end
56     
57     def self.start
58       Thread.new do
59         loop do
60           @@handler.handle_events
61         end
62       end
63     end
64     
65   end
66 end