lib/yarn/server.rb in yarn-0.0.1 vs lib/yarn/server.rb in yarn-0.0.2

- old
+ new

@@ -3,57 +3,66 @@ module Yarn class Server include Logging - attr_accessor :host, :port, :socket, :socket_listener + attr_accessor :host, :port, :socket, :workers - def initialize(app=nil,opts={}) + def initialize(options={}) # merge given options with default values - options = { + opts = { output: $stdout, host: '127.0.0.1', - port: 3000 - }.merge(opts) + port: 3000, + workers: 4, + rack: "off" + }.merge(options) - @app = app - @host,@port,$output = options[:host], options[:port], options[:output] + @app = nil + @app = load_rack_app(opts[:rack]) unless opts[:rack] == "off" + @host, @port, @num_workers = opts[:host], opts[:port], opts[:workers] + @workers = [] + $output, $debug = opts[:output], opts[:debug] + end + + def load_rack_app(app_path) + if File.exists?(app_path) + config_file = File.read(app_path) + rack_application = eval("Rack::Builder.new { #{config_file} }") + else + log "#{app_path} does not exist. Exiting." + Kernel::exit + end + end + + def start + trap("INT") { stop } @socket = TCPServer.new(@host, @port) + log "Yarn started #{@num_workers} workers and is listening on #{@host}:#{@port}" - @handler = @app ? RackHandler.new(@app, options) : RequestHandler.new(options) + init_workers - log "Yarn started #{"w/ Rack " if opts[:rackup_file]}and accepting requests on #{@host}:#{@port}" + # Waits here for all processes to exit + Process.waitall end - def start - @socket_listener = Thread.new do - loop do - begin + def init_workers + @num_workers.times do + @workers << fork do + trap("INT") { exit } + loop do + handler ||= @app ? RackHandler.new(@app) : RequestHandler.new session = @socket.accept - Thread.new { @handler.clone.run session } - rescue Exception => e - session.close - log e.message - log e.backtrace + handler.run session end end end - - begin - @socket_listener.join - rescue Interrupt => e - log "Caught interrupt, stopping..." - ensure - stop - end end def stop - @socket.close if @socket - @socket = nil - @socket_listener.kill if @socket_listener + @socket.close if (@socket && !@socket.closed?) - log "Server stopped" + log "Server stopped. Have a nice day!" end end end