================ @@ -46,8 +48,79 @@ SaveCoreOptions::GetOutputFile() const { return m_file; } +Status SaveCoreOptions::SetProcess(lldb::ProcessSP process_sp) { + Status error; + if (!process_sp) { + ClearProcessSpecificData(); + m_process_sp = nullptr; + return error; + } + + if (!process_sp->IsValid()) { + error.SetErrorString("Cannot assign an invalid process."); + return error; + } + + if (m_process_sp) + ClearProcessSpecificData(); + + m_process_sp = process_sp; + return error; +} + +Status SaveCoreOptions::AddThread(lldb::ThreadSP thread_sp) { + Status error; + if (!thread_sp) { + error.SetErrorString("Thread is null"); + return error; + } + + if (m_process_sp) { + if (m_process_sp != thread_sp->GetProcess()) { + error.SetErrorString("Cannot add a thread from a different process."); + return error; + } + } else { + m_process_sp = thread_sp->GetProcess(); + } + + m_threads_to_save[thread_sp->GetID()]; + return error; +} + +bool SaveCoreOptions::RemoveThread(lldb::ThreadSP thread_sp) { + return thread_sp && m_threads_to_save.erase(thread_sp->GetID()) > 0; +} + +bool SaveCoreOptions::ShouldThreadBeSaved(lldb::tid_t tid) const { + // If the user specified no threads to save, then we save all threads. + if (m_threads_to_save.empty()) + return true; + return m_threads_to_save.count(tid) > 0; +} + +Status SaveCoreOptions::EnsureValidConfiguration( + lldb::ProcessSP process_to_save) const { + Status error; + std::string error_str; + if (!m_threads_to_save.empty() && GetStyle() == lldb::eSaveCoreFull) + error_str += "Cannot save a full core with a subset of threads\n"; + + if (m_process_sp && m_process_sp != process_to_save) + error_str += "Cannot save core for process using supplied core options. " + "Options were constructed targeting a different process. \n"; + + if (!error_str.empty()) + error.SetErrorString(error_str); + + return error; +} + +void SaveCoreOptions::ClearProcessSpecificData() { m_threads_to_save.clear(); } + void SaveCoreOptions::Clear() { m_file = std::nullopt; m_plugin_name = std::nullopt; m_style = std::nullopt; ---------------- clayborg wrote:
Add: ``` m_process_sp.reset(); ``` https://github.com/llvm/llvm-project/pull/100443 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits