lib/zeus/server.rb in zeus-0.3.1 vs lib/zeus/server.rb in zeus-0.4.0
- old
+ new
@@ -7,11 +7,11 @@
extend Forwardable
autoload :Stage, 'zeus/server/stage'
autoload :Acceptor, 'zeus/server/acceptor'
autoload :FileMonitor, 'zeus/server/file_monitor'
- autoload :ProcessTree, 'zeus/server/process_tree'
+ autoload :LoadTracking, 'zeus/server/load_tracking'
autoload :ForkedProcess, 'zeus/server/forked_process'
autoload :ClientHandler, 'zeus/server/client_handler'
autoload :ProcessTreeMonitor, 'zeus/server/process_tree_monitor'
autoload :AcceptorRegistrationMonitor, 'zeus/server/acceptor_registration_monitor'
@@ -24,15 +24,14 @@
end
def initialize
@file_monitor = FileMonitor::FSEvent.new(&method(:dependency_did_change))
@acceptor_registration_monitor = AcceptorRegistrationMonitor.new
- @process_tree_monitor = ProcessTreeMonitor.new(@file_monitor)
- acceptor_commands = self.class.acceptors.map(&:commands).flatten
+ @process_tree_monitor = ProcessTreeMonitor.new(@file_monitor, @@definition)
@client_handler = ClientHandler.new(acceptor_commands, self)
- @plan = @@definition.to_domain_object(self)
+ @plan = @@definition.to_process_object(self)
end
def dependency_did_change(file)
@process_tree_monitor.kill_nodes_with_feature(file)
end
@@ -41,37 +40,63 @@
[@file_monitor, @process_tree_monitor, @acceptor_registration_monitor, @client_handler]
end
def run
$0 = "zeus master"
- trap("INT") { exit 0 }
+ trap("TERM") { exit 0 }
+ trap("INT") {
+ puts "\n\x1b[31mExiting\x1b[0m"
+ exit 0
+ }
+ LoadTracking.inject!(self)
+
@plan.run(true) # boot the actual app
monitors.each(&:close_child_socket)
- loop do
- ready, = IO.select(monitors.map(&:datasource), [], [], 1)
- next unless ready
- monitors.each do |m|
- m.on_datasource_event if ready.include?(m.datasource)
- end
- end
+ runloop!
ensure
File.unlink(Zeus::SOCKET_NAME)
end
+ # this is used in conjunction with Zeus::LoadTracking to track files loaded
+ # using `load` rather than `require`.
+ def add_extra_feature(full_expanded_path)
+ @extra_loaded_features ||= []
+ @extra_loaded_features << full_expanded_path
+ end
+ def extra_features
+ @extra_loaded_features || []
+ end
+
# Child process API
def __CHILD__close_parent_sockets
monitors.each(&:close_parent_socket)
end
def_delegators :@acceptor_registration_monitor,
:__CHILD__register_acceptor,
:__CHILD__find_acceptor_for_command
def_delegators :@process_tree_monitor,
- :__CHILD__pid_has_ppid,
- :__CHILD__pid_has_feature
+ :__CHILD__stage_starting_with_pid,
+ :__CHILD__stage_has_feature
+
+ private
+
+ def acceptor_commands
+ self.class.acceptors.map(&:commands).flatten
+ end
+
+ def runloop!
+ loop do
+ ready, = IO.select(monitors.map(&:datasource), [], [], 1)
+ next unless ready
+ monitors.each do |m|
+ m.on_datasource_event if ready.include?(m.datasource)
+ end
+ end
+ end
end
end