mib created this revision. mib added a reviewer: JDevlieghere. mib added a project: LLDB. mib requested review of this revision. Herald added a subscriber: lldb-commits.
Since we can have multiple Scripted Threads per Scripted Process, having only a single ScriptedThreadInterface (with a single object instance) will cause the method calls to be done on the wrong object. Instead, this patch creates a separate ScriptedThreadInterface for each new lldb_private::ScriptedThread to make sure we interact with the right instance. rdar://87427911 Signed-off-by: Med Ismail Bennani <medismail.benn...@gmail.com> Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D117070 Files: lldb/include/lldb/Interpreter/ScriptedProcessInterface.h lldb/source/Plugins/Process/scripted/ScriptedThread.cpp lldb/source/Plugins/Process/scripted/ScriptedThread.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h =================================================================== --- lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h +++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h @@ -57,7 +57,7 @@ llvm::Optional<std::string> GetScriptedThreadPluginName() override; private: - lldb::ScriptedThreadInterfaceSP GetScriptedThreadInterface() override; + lldb::ScriptedThreadInterfaceSP CreateScriptedThreadInterface() override; }; } // namespace lldb_private Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp =================================================================== --- lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp +++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp @@ -165,12 +165,8 @@ } lldb::ScriptedThreadInterfaceSP -ScriptedProcessPythonInterface::GetScriptedThreadInterface() { - if (!m_scripted_thread_interface_sp) - m_scripted_thread_interface_sp = - std::make_shared<ScriptedThreadPythonInterface>(m_interpreter); - - return m_scripted_thread_interface_sp; +ScriptedProcessPythonInterface::CreateScriptedThreadInterface() { + return std::make_shared<ScriptedThreadPythonInterface>(m_interpreter); } #endif Index: lldb/source/Plugins/Process/scripted/ScriptedThread.h =================================================================== --- lldb/source/Plugins/Process/scripted/ScriptedThread.h +++ lldb/source/Plugins/Process/scripted/ScriptedThread.h @@ -59,6 +59,7 @@ std::shared_ptr<DynamicRegisterInfo> GetDynamicRegisterInfo(); const ScriptedProcess &m_scripted_process; + lldb::ScriptedThreadInterfaceSP m_scripted_thread_interface_sp = nullptr; std::shared_ptr<DynamicRegisterInfo> m_register_info_sp = nullptr; lldb_private::StructuredData::Generic *m_script_object = nullptr; }; Index: lldb/source/Plugins/Process/scripted/ScriptedThread.cpp =================================================================== --- lldb/source/Plugins/Process/scripted/ScriptedThread.cpp +++ lldb/source/Plugins/Process/scripted/ScriptedThread.cpp @@ -29,7 +29,9 @@ } ScriptedThread::ScriptedThread(ScriptedProcess &process, Status &error) - : Thread(process, LLDB_INVALID_THREAD_ID), m_scripted_process(process) { + : Thread(process, LLDB_INVALID_THREAD_ID), m_scripted_process(process), + m_scripted_thread_interface_sp( + m_scripted_process.GetInterface().CreateScriptedThreadInterface()) { if (!process.IsValid()) { error.SetErrorString("Invalid scripted process"); return; @@ -190,7 +192,7 @@ } lldb::ScriptedThreadInterfaceSP ScriptedThread::GetInterface() const { - return m_scripted_process.GetInterface().GetScriptedThreadInterface(); + return m_scripted_thread_interface_sp; } std::shared_ptr<DynamicRegisterInfo> ScriptedThread::GetDynamicRegisterInfo() { Index: lldb/include/lldb/Interpreter/ScriptedProcessInterface.h =================================================================== --- lldb/include/lldb/Interpreter/ScriptedProcessInterface.h +++ lldb/include/lldb/Interpreter/ScriptedProcessInterface.h @@ -68,11 +68,9 @@ protected: friend class ScriptedThread; - virtual lldb::ScriptedThreadInterfaceSP GetScriptedThreadInterface() { + virtual lldb::ScriptedThreadInterfaceSP CreateScriptedThreadInterface() { return nullptr; } - - lldb::ScriptedThreadInterfaceSP m_scripted_thread_interface_sp = nullptr; }; class ScriptedThreadInterface : virtual public ScriptedInterface {
Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h =================================================================== --- lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h +++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h @@ -57,7 +57,7 @@ llvm::Optional<std::string> GetScriptedThreadPluginName() override; private: - lldb::ScriptedThreadInterfaceSP GetScriptedThreadInterface() override; + lldb::ScriptedThreadInterfaceSP CreateScriptedThreadInterface() override; }; } // namespace lldb_private Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp =================================================================== --- lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp +++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp @@ -165,12 +165,8 @@ } lldb::ScriptedThreadInterfaceSP -ScriptedProcessPythonInterface::GetScriptedThreadInterface() { - if (!m_scripted_thread_interface_sp) - m_scripted_thread_interface_sp = - std::make_shared<ScriptedThreadPythonInterface>(m_interpreter); - - return m_scripted_thread_interface_sp; +ScriptedProcessPythonInterface::CreateScriptedThreadInterface() { + return std::make_shared<ScriptedThreadPythonInterface>(m_interpreter); } #endif Index: lldb/source/Plugins/Process/scripted/ScriptedThread.h =================================================================== --- lldb/source/Plugins/Process/scripted/ScriptedThread.h +++ lldb/source/Plugins/Process/scripted/ScriptedThread.h @@ -59,6 +59,7 @@ std::shared_ptr<DynamicRegisterInfo> GetDynamicRegisterInfo(); const ScriptedProcess &m_scripted_process; + lldb::ScriptedThreadInterfaceSP m_scripted_thread_interface_sp = nullptr; std::shared_ptr<DynamicRegisterInfo> m_register_info_sp = nullptr; lldb_private::StructuredData::Generic *m_script_object = nullptr; }; Index: lldb/source/Plugins/Process/scripted/ScriptedThread.cpp =================================================================== --- lldb/source/Plugins/Process/scripted/ScriptedThread.cpp +++ lldb/source/Plugins/Process/scripted/ScriptedThread.cpp @@ -29,7 +29,9 @@ } ScriptedThread::ScriptedThread(ScriptedProcess &process, Status &error) - : Thread(process, LLDB_INVALID_THREAD_ID), m_scripted_process(process) { + : Thread(process, LLDB_INVALID_THREAD_ID), m_scripted_process(process), + m_scripted_thread_interface_sp( + m_scripted_process.GetInterface().CreateScriptedThreadInterface()) { if (!process.IsValid()) { error.SetErrorString("Invalid scripted process"); return; @@ -190,7 +192,7 @@ } lldb::ScriptedThreadInterfaceSP ScriptedThread::GetInterface() const { - return m_scripted_process.GetInterface().GetScriptedThreadInterface(); + return m_scripted_thread_interface_sp; } std::shared_ptr<DynamicRegisterInfo> ScriptedThread::GetDynamicRegisterInfo() { Index: lldb/include/lldb/Interpreter/ScriptedProcessInterface.h =================================================================== --- lldb/include/lldb/Interpreter/ScriptedProcessInterface.h +++ lldb/include/lldb/Interpreter/ScriptedProcessInterface.h @@ -68,11 +68,9 @@ protected: friend class ScriptedThread; - virtual lldb::ScriptedThreadInterfaceSP GetScriptedThreadInterface() { + virtual lldb::ScriptedThreadInterfaceSP CreateScriptedThreadInterface() { return nullptr; } - - lldb::ScriptedThreadInterfaceSP m_scripted_thread_interface_sp = nullptr; }; class ScriptedThreadInterface : virtual public ScriptedInterface {
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits