class QuickML::Server

Public Class Methods

new(config) click to toggle source
# File vendor/qwik/lib/qwik/ml-server.rb, line 28
def initialize (config)
  @config = config
  $ml_debug = true if @config.debug
  @status = :stop
  @logger = @config.logger
  @server = TCPServer.new(@config.bind_address, @config.ml_port)
end

Public Instance Methods

shutdown() click to toggle source
# File vendor/qwik/lib/qwik/ml-server.rb, line 46
def shutdown
  begin
    @server.shutdown
  rescue Errno::ENOTCONN
    p 'Already disconnected.'
  end
  @status = :shutdown
end
start() click to toggle source
# File vendor/qwik/lib/qwik/ml-server.rb, line 36
def start
  raise 'server already started' if @status != :stop
  write_pid_file(@config.ml_pid_file)
  @logger.log sprintf('Server started at %s:%d [%d]',
                      'localhost', @config.ml_port, Process.pid)
  accept
  @logger.log "Server exited [#{Process.pid}]"
  remove_pid_file(@config.ml_pid_file)
end

Private Instance Methods

accept() click to toggle source
# File vendor/qwik/lib/qwik/ml-server.rb, line 57
def accept
  running_sessions = []
  @status = :running
  while @status == :running
    begin 
      t = Thread.new(@server.accept) {|s|
        process_session(s)
      }
      t.abort_on_exception = true
      running_sessions.push(t)
    rescue Errno::ECONNABORTED # caused by @server.shutdown
    rescue Errno::EINVAL
    end
    running_sessions.delete_if {|t| t.status == false }
    if running_sessions.length >= @config.max_threads
      ThreadsWait.new(running_sessions).next_wait
    end
  end
  running_sessions.each {|t| t.join }
end
process_session(socket) click to toggle source
# File vendor/qwik/lib/qwik/ml-server.rb, line 78
def process_session (socket)
  begin
    c = @config
    session = Session.new(c, c.logger, c.catalog, socket)
    session.start
  rescue Exception => e
    @logger.log "Unknown Session Error: #{e.class}: #{e.message}"
    @logger.log e.backtrace
  end
end