================
@@ -66,3 +66,47 @@ void Progress::ReportProgress() {
                              m_debugger_id);
   }
 }
+
+void ProgressManager::Initialize() {
+  lldbassert(!InstanceImpl() && "A progress report manager already exists.");
+  InstanceImpl().emplace();
+}
+
+void ProgressManager::Terminate() {
+  lldbassert(InstanceImpl() &&
+             "A progress report manager has already been terminated.");
+  InstanceImpl().reset();
+}
+
+std::optional<ProgressManager> &ProgressManager::InstanceImpl() {
+  static std::optional<ProgressManager> g_progress_manager;
+  return g_progress_manager;
+}
+
+ProgressManager::ProgressManager() : m_progress_map() {}
+
+ProgressManager::~ProgressManager() {}
+
+ProgressManager &ProgressManager::Instance() { return *InstanceImpl(); }
----------------
JDevlieghere wrote:

Yeah, I understand why we might want to leak the vector and do in other places. 
But do you think we should just do that unconditionally, no matter whether it's 
a problem or not? The other subsystems I mention use the same approach and they 
don't crash in production even though they don't check the optional before 
dereferencing it (treating it as a precondition). 

I guess the point I'm trying to make is let's not leak it proactively, but use 
the stricter approach to force a crash/assert in debug builds and tests, and 
try to avoid these issues, rather than work around them. If we find that it 
does end up crashing because someone emits a progress report when we're 
shutting down LLDB **and** we've investigated the bug and think the 
functionality is important, I'm totally on board with leaking it. Does that 
sound like a reasonable compromise? 

https://github.com/llvm/llvm-project/pull/81319
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to