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