Class: MilkTea::DAP::Server

Inherits:
Object
  • Object
show all
Includes:
ServerBreakpoints, ServerDebugMap, ServerHandlers, ServerLLDBBackend, ServerLaunch, ServerPauseDiagnostics, ServerUtilities, ServerWire
Defined in:
lib/milk_tea/dap/server.rb,
lib/milk_tea/dap/server/wire.rb,
lib/milk_tea/dap/server/launch.rb,
lib/milk_tea/dap/server/handlers.rb,
lib/milk_tea/dap/server/debug_map.rb,
lib/milk_tea/dap/server/utilities.rb,
lib/milk_tea/dap/server/breakpoints.rb,
lib/milk_tea/dap/server/lldb_backend.rb,
lib/milk_tea/dap/server/pause_diagnostics.rb

Overview

Minimal DAP server with strict request/response/event envelopes.

Defined Under Namespace

Modules: ServerBreakpoints, ServerDebugMap, ServerHandlers, ServerLLDBBackend, ServerLaunch, ServerPauseDiagnostics, ServerUtilities, ServerWire

Constant Summary collapse

ADAPTER_CAPABILITIES =
{
  supportsConfigurationDoneRequest: true,
  supportsFunctionBreakpoints: true,
  supportsConditionalBreakpoints: false,
  supportsHitConditionalBreakpoints: false,
  supportsPauseRequest: true,
  supportsEvaluateForHovers: false,
  supportsSetVariable: false,
  supportsTerminateRequest: true,
  supportTerminateDebuggee: true,
  supportsLoadedSourcesRequest: true,
  exceptionBreakpointFilters: [],
}.freeze

Constants included from ServerUtilities

ServerUtilities::PERF_LOG_THRESHOLD_MS

Instance Method Summary collapse

Constructor Details

#initialize(protocol: Protocol.new, session: Session.new, backend_factory: nil, preferred_backend_kind: "process", adapter_command: nil) ⇒ Server

Returns a new instance of Server.



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/milk_tea/dap/server.rb', line 37

def initialize(protocol: Protocol.new, session: Session.new, backend_factory: nil, preferred_backend_kind: "process", adapter_command: nil)
  @protocol = protocol
  @session = session
  @backend_factory = backend_factory
  @preferred_backend_kind = preferred_backend_kind.to_s.empty? ? "process" : preferred_backend_kind.to_s
  @default_adapter_command = adapter_command&.dup
  @handlers = {}
  @write_mutex = Mutex.new
  @client_request_mutex = Mutex.new
  @pending_client_responses = {}
  @incoming_messages = Queue.new
  @reader_thread = nil
  @background_threads = []
  @background_threads_mutex = Mutex.new
  @runtime_mutex = Mutex.new
  @runtime_pid = nil
  @runtime_paused = false
  @tmp_dirs = []
  @lldb_backend = nil
  @backend_initialized = false
  @backend_capabilities = {}
  @breakpoints_synced_to_backend = false
  @function_breakpoints_synced_to_backend = false
  @exception_breakpoints_synced_to_backend = false
  @backend_start_thread = nil
  @backend_auto_continue_after_configuration = false
  @backend_stopped_thread_id = nil
  @backend_pause_requested = false
  @last_forwarded_continued_signature = nil
  @backend_configuration_mutex = Mutex.new
  @backend_configuration_condition = ConditionVariable.new
  @backend_configuration_ready = false
  @debug_map = nil
  @frame_debug_functions = {}
  @variables_reference_debug_functions = {}
  @reverse_request_timeout = Float(ENV.fetch("MILK_TEA_DAP_REVERSE_REQUEST_TIMEOUT", "15"))
  register_handlers
end

Instance Method Details

#runObject



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/milk_tea/dap/server.rb', line 76

def run
  start_client_reader

  loop do
    message = @incoming_messages.pop
    break if message.nil?
    next if message.equal?(Protocol::INVALID_MESSAGE)

    process_message(message)
    break if @session.should_exit?
  end
ensure
  @backend_start_thread&.join(0.2)
  join_background_threads
  @reader_thread&.join(0.2)
end