class DEBUGGER__::UI_ServerBase

def activate session, on_fork: false

def activate session, on_fork: false
  @session = session
  @reader_thread = Thread.new do
    # An error on this thread should break the system.
    Thread.current.abort_on_exception = true
    Thread.current.name = 'DEBUGGER__::Server::reader'
    accept do |server, already_connected: false|
      DEBUGGER__.warn "Connected."
      greeting_done = false
      @need_pause_at_first = true
      @accept_m.synchronize{
        @sock = server
        greeting
        greeting_done = true
        @accept_cv.signal
        # flush unsent messages
        @unsent_messages.each{|m|
          @sock.puts m
        } if @repl
        @unsent_messages.clear
        @q_msg = Queue.new
        @q_ans = Queue.new
      } unless already_connected
      setup_interrupt do
        pause if !already_connected && @need_pause_at_first
        process
      end
    rescue GreetingError => e
      DEBUGGER__.warn "GreetingError: #{e.message}"
      next
    rescue Terminate
      raise # should catch at outer scope
    rescue RetryConnection
      next
    rescue => e
      DEBUGGER__.warn "ReaderThreadError: #{e}"
      pp e.backtrace
    ensure
      DEBUGGER__.warn "Disconnected."
      cleanup_reader if greeting_done
    end # accept
  rescue Terminate
    # ignore
  end
end