@@ -440,16 +440,6 @@ void ProgressEventThreadFunction(DAP &dap) {
440440 }
441441}
442442
443- static llvm::StringRef GetModuleEventReason (uint32_t event_mask) {
444- if (event_mask & lldb::SBTarget::eBroadcastBitModulesLoaded)
445- return " new" ;
446- if (event_mask & lldb::SBTarget::eBroadcastBitModulesUnloaded)
447- return " removed" ;
448- assert (event_mask & lldb::SBTarget::eBroadcastBitSymbolsLoaded ||
449- event_mask & lldb::SBTarget::eBroadcastBitSymbolsChanged);
450- return " changed" ;
451- }
452-
453443// All events from the debugger, target, process, thread and frames are
454444// received in this function that runs in its own thread. We are using a
455445// "FILE *" to output packets back to VS Code and they have mutexes in them
@@ -536,18 +526,41 @@ void EventThreadFunction(DAP &dap) {
536526 event_mask & lldb::SBTarget::eBroadcastBitModulesUnloaded ||
537527 event_mask & lldb::SBTarget::eBroadcastBitSymbolsLoaded ||
538528 event_mask & lldb::SBTarget::eBroadcastBitSymbolsChanged) {
539- llvm::StringRef reason = GetModuleEventReason (event_mask);
540529 const uint32_t num_modules =
541530 lldb::SBTarget::GetNumModulesFromEvent (event);
531+ std::lock_guard<std::mutex> guard (dap.modules_mutex );
542532 for (uint32_t i = 0 ; i < num_modules; ++i) {
543533 lldb::SBModule module =
544534 lldb::SBTarget::GetModuleAtIndexFromEvent (i, event);
545535 if (!module .IsValid ())
546536 continue ;
537+ llvm::StringRef module_id = module .GetUUIDString ();
538+ if (module_id.empty ())
539+ continue ;
540+
541+ llvm::StringRef reason;
542+ bool id_only = false ;
543+ if (event_mask & lldb::SBTarget::eBroadcastBitModulesLoaded) {
544+ dap.modules .insert (module_id);
545+ reason = " new" ;
546+ } else {
547+ // If this is a module we've never told the client about, don't
548+ // send an event.
549+ if (!dap.modules .contains (module_id))
550+ continue ;
551+
552+ if (event_mask & lldb::SBTarget::eBroadcastBitModulesUnloaded) {
553+ dap.modules .erase (module_id);
554+ reason = " removed" ;
555+ id_only = true ;
556+ } else {
557+ reason = " changed" ;
558+ }
559+ }
547560
548561 llvm::json::Object body;
549562 body.try_emplace (" reason" , reason);
550- body.try_emplace (" module" , CreateModule (dap.target , module ));
563+ body.try_emplace (" module" , CreateModule (dap.target , module , id_only ));
551564 llvm::json::Object module_event = CreateEventObject (" module" );
552565 module_event.try_emplace (" body" , std::move (body));
553566 dap.SendJSON (llvm::json::Value (std::move (module_event)));
@@ -2001,9 +2014,20 @@ void request_modules(DAP &dap, const llvm::json::Object &request) {
20012014 FillResponse (request, response);
20022015
20032016 llvm::json::Array modules;
2004- for (size_t i = 0 ; i < dap.target .GetNumModules (); i++) {
2005- lldb::SBModule module = dap.target .GetModuleAtIndex (i);
2006- modules.emplace_back (CreateModule (dap.target , module ));
2017+
2018+ {
2019+ std::lock_guard<std::mutex> guard (dap.modules_mutex );
2020+ for (size_t i = 0 ; i < dap.target .GetNumModules (); i++) {
2021+ lldb::SBModule module = dap.target .GetModuleAtIndex (i);
2022+ if (!module .IsValid ())
2023+ continue ;
2024+
2025+ llvm::StringRef module_id = module .GetUUIDString ();
2026+ if (!module_id.empty ())
2027+ dap.modules .insert (module_id);
2028+
2029+ modules.emplace_back (CreateModule (dap.target , module ));
2030+ }
20072031 }
20082032
20092033 llvm::json::Object body;
0 commit comments