module DebuggerXml

Constants

VERSION

Attributes

control_thread[RW]
handler[RW]
logger[RW]
queue[RW]
wait_for_start[RW]

Public Class Methods

proceed() click to toggle source
# File lib/debugger_xml.rb, line 75
def proceed
  return unless @mutex
  @mutex.synchronize { @proceed.signal }
end
start_for_vim(proxy, options) click to toggle source
# File lib/debugger_xml.rb, line 35
def start_for_vim(proxy, options)
  return if @control_thread
  logger.puts("Going to daemonize")
  daemonize!
  logger.puts("Successfully daemonized")
  $stdout.reopen(options.output_file, 'w')
  $stdout.sync
  $stderr.reopen($stdout)
  logger.puts("Redirected stderr")
  @mutex = Mutex.new
  @proceed = ConditionVariable.new
  @queue = Queue.new
  proxy.start
  logger.puts("Started debugger")
  File.unlink(options.socket) if File.exist?(options.socket)
  server = UNIXServer.new(options.socket)
  Vim::Notification.new("establish_connection", options).send
  logger.puts("Sent 'established_connection' command")
  @control_thread = proxy.debug_thread_class.new do
    begin
      while (session = server.accept)
        logger.puts("Accepted connection");
        interface = Vim::Interface.new(session, options)
        processor = Vim::ControlCommandProcessor.new(interface, proxy)
        proxy.handler = Vim::Processor.new(processor, interface, proxy)
        logger.puts("Going to process commands");
        processor.process_commands
      end
    rescue Exception => e
      logger.puts("INTERNAL ERROR!!! #{$!}") rescue nil
      logger.puts($!.backtrace.map { |l| "\t#{l}" }.join("\n")) rescue nil
      raise e
    ensure
      logger.puts("Closing server");
      server.close
    end
  end
  @mutex.synchronize { @proceed.wait(@mutex) } if wait_for_start
end
start_remote_ide(proxy, host, port) click to toggle source
# File lib/debugger_xml.rb, line 12
def start_remote_ide(proxy, host, port)
  return if @control_thread
  @mutex = Mutex.new
  @proceed = ConditionVariable.new
  @queue = Queue.new
  proxy.start
  @control_thread = proxy.debug_thread_class.new do
    server = TCPServer.new(host, port)
    $stderr.printf "Fast Debugger (debugger-xml #{VERSION}) listens on #{host}:#{port}\n"
    while (session = server.accept)
      dispatcher = ENV['IDE_PROCESS_DISPATCHER']
      if dispatcher && !dispatcher.include?(":")
        ENV['IDE_PROCESS_DISPATCHER'] = "#{session.peeraddr[2]}:#{dispatcher}"
      end
      interface = DebuggerXml::Ide::Interface.new(session)
      processor = DebuggerXml::Ide::ControlCommandProcessor.new(interface, proxy)
      debugger_class.handler = DebuggerXml::Ide::Processor.new(interface, proxy)
      processor.process_commands
    end
  end
  @mutex.synchronize { @proceed.wait(@mutex) } if wait_for_start
end

Private Class Methods

daemonize!() click to toggle source
# File lib/debugger_xml.rb, line 82
def daemonize!
  pid = Process.fork
  if pid
    print pid
    exit
  end
end