lib/zeus/server.rb in zeus-0.2.0.beta1 vs lib/zeus/server.rb in zeus-0.2.0.beta2
- old
+ new
@@ -1,32 +1,32 @@
require 'json'
require 'socket'
require 'rb-kqueue'
-
require 'zeus/process'
-require 'zeus/dsl'
-require 'zeus/server/file_monitor'
-require 'zeus/server/client_handler'
-require 'zeus/server/process_tree_monitor'
-require 'zeus/server/acceptor_registration_monitor'
-require 'zeus/server/acceptor'
module Zeus
class Server
+ autoload :Stage, 'zeus/server/stage'
+ autoload :Acceptor, 'zeus/server/acceptor'
+ autoload :FileMonitor, 'zeus/server/file_monitor'
+ autoload :ClientHandler, 'zeus/server/client_handler'
+ autoload :ProcessTreeMonitor, 'zeus/server/process_tree_monitor'
+ autoload :AcceptorRegistrationMonitor, 'zeus/server/acceptor_registration_monitor'
+
def self.define!(&b)
@@definition = Zeus::DSL::Evaluator.new.instance_eval(&b)
end
def self.acceptors
@@definition.acceptors
end
attr_reader :client_handler, :acceptor_registration_monitor
def initialize
- @file_monitor = FileMonitor.new(&method(:dependency_did_change))
+ @file_monitor = FileMonitor::FSEvent.new(&method(:dependency_did_change))
@acceptor_registration_monitor = AcceptorRegistrationMonitor.new
@process_tree_monitor = ProcessTreeMonitor.new
@client_handler = ClientHandler.new(acceptor_registration_monitor)
# TODO: deprecate Zeus::Server.define! maybe. We can do that better...
@@ -37,26 +37,22 @@
@process_tree_monitor.kill_nodes_with_feature(file)
end
PID_TYPE = "P"
def w_pid line
- begin
- @w_msg.send(PID_TYPE + line, 0)
- rescue Errno::ENOBUFS
- sleep 0.2
- retry
- end
+ @w_msg.send(PID_TYPE + line, 0)
+ rescue Errno::ENOBUFS
+ sleep 0.2
+ retry
end
FEATURE_TYPE = "F"
def w_feature line
- begin
- @w_msg.send(FEATURE_TYPE + line, 0)
- rescue Errno::ENOBUFS
- sleep 0.2
- retry
- end
+ @w_msg.send(FEATURE_TYPE + line, 0)
+ rescue Errno::ENOBUFS
+ sleep 0.2
+ retry
end
def run
$0 = "zeus master"
trap("INT") { exit 0 }
@@ -67,51 +63,41 @@
# boot the actual app
@plan.run
@w_msg.close
loop do
- @file_monitor.process_events
+ monitors = [@file_monitor, @acceptor_registration_monitor, @client_handler]
+ # TODO: Make @r_msg a Monitor instead. All that logic should be its own thing.
+ datasources = [@r_msg, *monitors.map(&:datasource)]
- datasources = [@r_msg,
- @acceptor_registration_monitor.datasource, @client_handler.datasource]
-
- # TODO: It would be really nice if we could put the queue poller in the select somehow.
- # --investigate kqueue. Is this possible?
- begin
- rs, _, _ = IO.select(datasources, [], [], 1)
- rescue Errno::EBADF
- puts "EBADF" unless defined?($asdf)
- sleep 1
- $asdf = true
+ ready, _, _ = IO.select(datasources, [], [], 1)
+ next unless ready
+ monitors.each do |m|
+ m.on_datasource_event if ready.include?(m.datasource)
end
- rs.each do |r|
- case r
- when @acceptor_registration_monitor.datasource
- @acceptor_registration_monitor.on_datasource_event
- when @r_msg ; handle_messages
- when @client_handler.datasource
- @client_handler.on_datasource_event
- end
- end if rs
+ handle_messages if ready.include?(@r_msg)
end
+ ensure
+ File.unlink(Zeus::SOCKET_NAME)
end
def handle_messages
loop do
- begin
- data = @r_msg.recv_nonblock(1024)
- case data[0]
- when FEATURE_TYPE
- handle_feature_message(data[1..-1])
- when PID_TYPE
- handle_pid_message(data[1..-1])
- else
- raise "Unrecognized message"
- end
- rescue Errno::EAGAIN
- break
- end
+ handle_message
+ end
+ rescue Errno::EAGAIN
+ end
+
+ def handle_message
+ data = @r_msg.recv_nonblock(1024)
+ case data[0]
+ when FEATURE_TYPE
+ handle_feature_message(data[1..-1])
+ when PID_TYPE
+ handle_pid_message(data[1..-1])
+ else
+ raise "Unrecognized message"
end
end
def handle_pid_message(data)
data =~ /(\d+):(\d+)/