OperatingSystemPython.cpp revision e15e58facd4814a2be1cc1aa385e9f9125b92993
1d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//===-- OperatingSystemPython.cpp --------------------------------*- C++ -*-===// 2d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// 3d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// The LLVM Compiler Infrastructure 4d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// 5d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// This file is distributed under the University of Illinois Open Source 6d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// License. See LICENSE.TXT for details. 7d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// 8d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//===----------------------------------------------------------------------===// 9d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 12d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#ifndef LLDB_DISABLE_PYTHON 13d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 14d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "OperatingSystemPython.h" 15d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// C Includes 16d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// C++ Includes 17d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// Other libraries and framework includes 18d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/ArchSpec.h" 19d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/DataBufferHeap.h" 20155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata#include "lldb/Core/Debugger.h" 21d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/Module.h" 22d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/PluginManager.h" 23d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/RegisterValue.h" 24e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton#include "lldb/Core/StreamString.h" 25d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/ValueObjectVariable.h" 26155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata#include "lldb/Interpreter/CommandInterpreter.h" 27155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata#include "lldb/Interpreter/PythonDataObjects.h" 28d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h" 29d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Symbol/ObjectFile.h" 30d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Symbol/VariableList.h" 31d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Target/Process.h" 32d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Target/StopInfo.h" 33d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Target/Target.h" 34d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Target/ThreadList.h" 35d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Target/Thread.h" 36d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "Plugins/Process/Utility/DynamicRegisterInfo.h" 3749ff4e6008bdeb28de57fa4c931aeb8cc67152d4Enrico Granata#include "Plugins/Process/Utility/RegisterContextDummy.h" 38d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "Plugins/Process/Utility/RegisterContextMemory.h" 39d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "Plugins/Process/Utility/ThreadMemory.h" 40d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 41d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonusing namespace lldb; 42d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonusing namespace lldb_private; 43d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 44d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonvoid 45d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::Initialize() 46d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 47d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 48d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton GetPluginDescriptionStatic(), 49d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton CreateInstance); 50d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 51d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 52d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonvoid 53d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::Terminate() 54d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 55d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton PluginManager::UnregisterPlugin (CreateInstance); 56d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 57d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 58d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystem * 59d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::CreateInstance (Process *process, bool force) 60d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 61d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton // Python OperatingSystem plug-ins must be requested by name, so force must be true 622e7f313dc473b036788319690116b324cb44b765Greg Clayton FileSpec python_os_plugin_spec (process->GetPythonOSPluginPath()); 632e7f313dc473b036788319690116b324cb44b765Greg Clayton if (python_os_plugin_spec && python_os_plugin_spec.Exists()) 642e7f313dc473b036788319690116b324cb44b765Greg Clayton { 65102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<OperatingSystemPython> os_ap (new OperatingSystemPython (process, python_os_plugin_spec)); 662e7f313dc473b036788319690116b324cb44b765Greg Clayton if (os_ap.get() && os_ap->IsValid()) 672e7f313dc473b036788319690116b324cb44b765Greg Clayton return os_ap.release(); 682e7f313dc473b036788319690116b324cb44b765Greg Clayton } 69d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton return NULL; 70d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 71d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 72d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 730e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString 74d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetPluginNameStatic() 75d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 760e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_name("python"); 770e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_name; 78d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 79d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 80d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonconst char * 81d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetPluginDescriptionStatic() 82d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 83d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton return "Operating system plug-in that gathers OS information from a python class that implements the necessary OperatingSystem functionality."; 84d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 85d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 86d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 872e7f313dc473b036788319690116b324cb44b765Greg ClaytonOperatingSystemPython::OperatingSystemPython (lldb_private::Process *process, const FileSpec &python_module_path) : 88d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton OperatingSystem (process), 89d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton m_thread_list_valobj_sp (), 90155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata m_register_info_ap (), 912e7f313dc473b036788319690116b324cb44b765Greg Clayton m_interpreter (NULL), 9252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton m_python_object_sp () 93d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 94155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata if (!process) 95155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata return; 9652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton TargetSP target_sp = process->CalculateTarget(); 97155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata if (!target_sp) 98155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata return; 99155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata m_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter(); 100155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata if (m_interpreter) 101155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata { 1022e7f313dc473b036788319690116b324cb44b765Greg Clayton 1032e7f313dc473b036788319690116b324cb44b765Greg Clayton std::string os_plugin_class_name (python_module_path.GetFilename().AsCString("")); 1042e7f313dc473b036788319690116b324cb44b765Greg Clayton if (!os_plugin_class_name.empty()) 10588b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton { 1062e7f313dc473b036788319690116b324cb44b765Greg Clayton const bool init_session = false; 1072e7f313dc473b036788319690116b324cb44b765Greg Clayton const bool allow_reload = true; 1082e7f313dc473b036788319690116b324cb44b765Greg Clayton char python_module_path_cstr[PATH_MAX]; 1092e7f313dc473b036788319690116b324cb44b765Greg Clayton python_module_path.GetPath(python_module_path_cstr, sizeof(python_module_path_cstr)); 1102e7f313dc473b036788319690116b324cb44b765Greg Clayton Error error; 1112e7f313dc473b036788319690116b324cb44b765Greg Clayton if (m_interpreter->LoadScriptingModule (python_module_path_cstr, allow_reload, init_session, error)) 1122e7f313dc473b036788319690116b324cb44b765Greg Clayton { 1132e7f313dc473b036788319690116b324cb44b765Greg Clayton // Strip the ".py" extension if there is one 1142e7f313dc473b036788319690116b324cb44b765Greg Clayton size_t py_extension_pos = os_plugin_class_name.rfind(".py"); 1152e7f313dc473b036788319690116b324cb44b765Greg Clayton if (py_extension_pos != std::string::npos) 1162e7f313dc473b036788319690116b324cb44b765Greg Clayton os_plugin_class_name.erase (py_extension_pos); 1172e7f313dc473b036788319690116b324cb44b765Greg Clayton // Add ".OperatingSystemPlugIn" to the module name to get a string like "modulename.OperatingSystemPlugIn" 1182e7f313dc473b036788319690116b324cb44b765Greg Clayton os_plugin_class_name += ".OperatingSystemPlugIn"; 11952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton ScriptInterpreterObjectSP object_sp = m_interpreter->OSPlugin_CreatePluginObject(os_plugin_class_name.c_str(), process->CalculateProcess()); 12052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (object_sp && object_sp->GetObject()) 12152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton m_python_object_sp = object_sp; 1222e7f313dc473b036788319690116b324cb44b765Greg Clayton } 12388b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton } 124155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata } 125d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 126d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 127d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::~OperatingSystemPython () 128d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 129d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 130d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 131d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonDynamicRegisterInfo * 132d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetDynamicRegisterInfo () 133d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 13488b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton if (m_register_info_ap.get() == NULL) 135d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton { 13652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (!m_interpreter || !m_python_object_sp) 13788b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton return NULL; 138e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OS)); 139467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton 140467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton if (log) 1415f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("OperatingSystemPython::GetDynamicRegisterInfo() fetching thread register definitions from python for pid %" PRIu64, m_process->GetID()); 142467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton 14352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton PythonDictionary dictionary(m_interpreter->OSPlugin_RegisterInfo(m_python_object_sp)); 14488b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton if (!dictionary) 14588b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton return NULL; 14688b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton 14788b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton m_register_info_ap.reset (new DynamicRegisterInfo (dictionary)); 14888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton assert (m_register_info_ap->GetNumRegisters() > 0); 14988b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton assert (m_register_info_ap->GetNumRegisterSets() > 0); 150d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton } 151d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton return m_register_info_ap.get(); 152d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 153d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 154d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//------------------------------------------------------------------ 155d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// PluginInterface protocol 156d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//------------------------------------------------------------------ 1570e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString 158d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetPluginName() 159d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 160d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton return GetPluginNameStatic(); 161d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 162d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 163d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonuint32_t 164d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetPluginVersion() 165d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 166d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton return 1; 167d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 168d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 169d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonbool 1704e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew KaylorOperatingSystemPython::UpdateThreadList (ThreadList &old_thread_list, 1714e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor ThreadList &core_thread_list, 1724e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor ThreadList &new_thread_list) 173d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 17452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (!m_interpreter || !m_python_object_sp) 175b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea return false; 176467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton 177e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OS)); 178467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton 1794a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham // First thing we have to do is get the API lock, and the run lock. We're going to change the thread 1804a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham // content of the process, and we're going to use python, which requires the API lock to do it. 1814a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham // So get & hold that. This is a recursive lock so we can grant it to any Python code called on the stack below us. 1824a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham Target &target = m_process->GetTarget(); 1834a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham Mutex::Locker api_locker (target.GetAPIMutex()); 1844a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham 185467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton if (log) 1865f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("OperatingSystemPython::UpdateThreadList() fetching thread data from python for pid %" PRIu64, m_process->GetID()); 187467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton 1889acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // The threads that are in "new_thread_list" upon entry are the threads from the 1899acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // lldb_private::Process subclass, no memory threads will be in this list. 1909acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton 191989c6f74bad9acb7580025c1fc35378799c28e43Enrico Granata auto lock = m_interpreter->AcquireInterpreterLock(); // to make sure threads_list stays alive 19252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton PythonList threads_list(m_interpreter->OSPlugin_ThreadsInfo(m_python_object_sp)); 19352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (threads_list) 194b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton { 195e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton if (log) 196e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton { 197e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton StreamString strm; 198e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton threads_list.Dump(strm); 199e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton log->Printf("threads_list = %s", strm.GetString().c_str()); 200e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton } 2019acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton uint32_t i; 20252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton const uint32_t num_threads = threads_list.GetSize(); 203863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (num_threads > 0) 2049acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton { 205863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton for (i=0; i<num_threads; ++i) 2069acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton { 207863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton PythonDictionary thread_dict(threads_list.GetItemAtIndex(i)); 208863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (thread_dict) 2099acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton { 210863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (thread_dict.GetItemForKey("core")) 211863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton { 212863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // We have some threads that are saying they are on a "core", which means 213863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // they map the threads that are gotten from the lldb_private::Process subclass 214863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // so clear the new threads list so the core threads don't show up 215863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton new_thread_list.Clear(); 216863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton break; 217863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton } 2189acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton } 2199acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton } 220863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton for (i=0; i<num_threads; ++i) 221b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton { 222863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton PythonDictionary thread_dict(threads_list.GetItemAtIndex(i)); 223863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (thread_dict) 224863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton { 225863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton ThreadSP thread_sp (CreateThreadFromThreadInfo (thread_dict, core_thread_list, old_thread_list, NULL)); 226863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (thread_sp) 227863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton new_thread_list.AddThread(thread_sp); 228863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton } 229b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton } 230b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton } 231b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton } 232863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton 233863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (new_thread_list.GetSize(false) == 0) 234b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton new_thread_list = old_thread_list; 235863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton 236d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton return new_thread_list.GetSize(false) > 0; 237d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 238d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 23952ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonThreadSP 2409acf3699d2bea583b45c762f4cd82b2a4af6131bGreg ClaytonOperatingSystemPython::CreateThreadFromThreadInfo (PythonDictionary &thread_dict, 2419acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton ThreadList &core_thread_list, 2429acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton ThreadList &old_thread_list, 2439acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton bool *did_create_ptr) 24452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{ 24552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton ThreadSP thread_sp; 24652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (thread_dict) 24752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton { 24852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton PythonString tid_pystr("tid"); 24952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton const tid_t tid = thread_dict.GetItemForKeyAsInteger (tid_pystr, LLDB_INVALID_THREAD_ID); 25036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton if (tid != LLDB_INVALID_THREAD_ID) 25152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton { 2529acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton PythonString core_pystr("core"); 25336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton PythonString name_pystr("name"); 25436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton PythonString queue_pystr("queue"); 255a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton //PythonString state_pystr("state"); 256a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton //PythonString stop_reason_pystr("stop_reason"); 25736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton PythonString reg_data_addr_pystr ("register_data_addr"); 25836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton 2599acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton const uint32_t core_number = thread_dict.GetItemForKeyAsInteger (core_pystr, UINT32_MAX); 26036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const addr_t reg_data_addr = thread_dict.GetItemForKeyAsInteger (reg_data_addr_pystr, LLDB_INVALID_ADDRESS); 26136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const char *name = thread_dict.GetItemForKeyAsString (name_pystr); 26236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const char *queue = thread_dict.GetItemForKeyAsString (queue_pystr); 26336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton //const char *state = thread_dict.GetItemForKeyAsString (state_pystr); 26436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton //const char *stop_reason = thread_dict.GetItemForKeyAsString (stop_reason_pystr); 26536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton 266a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // See if a thread already exists for "tid" 2679acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton thread_sp = old_thread_list.FindThreadByID (tid, false); 268a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton if (thread_sp) 269a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton { 270a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // A thread already does exist for "tid", make sure it was an operating system 271a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // plug-in generated thread. 272a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton if (!IsOperatingSystemPluginThread(thread_sp)) 273a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton { 274a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // We have thread ID overlap between the protocol threads and the 275a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // operating system threads, clear the thread so we create an 276a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // operating system thread for this. 277a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton thread_sp.reset(); 278a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton } 279a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton } 280a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton 28136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton if (!thread_sp) 28236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton { 28336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton if (did_create_ptr) 28436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton *did_create_ptr = true; 28536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton thread_sp.reset (new ThreadMemory (*m_process, 28636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton tid, 28736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton name, 28836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton queue, 28936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton reg_data_addr)); 2909acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton 2919acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton } 2929acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton 2939acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton if (core_number < core_thread_list.GetSize(false)) 2949acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton { 295a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton ThreadSP core_thread_sp (core_thread_list.GetThreadAtIndex(core_number, false)); 296a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton if (core_thread_sp) 297a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton { 298a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton ThreadSP backing_core_thread_sp (core_thread_sp->GetBackingThread()); 299a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton if (backing_core_thread_sp) 300a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton { 301a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton thread_sp->SetBackingThread(backing_core_thread_sp); 302a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton } 303a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton else 304a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton { 305a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton thread_sp->SetBackingThread(core_thread_sp); 306a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton } 307a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton } 30836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton } 30952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton } 31052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton } 31152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton return thread_sp; 31252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton} 31352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton 31452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton 31552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton 316d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonvoid 317d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::ThreadWasSelected (Thread *thread) 318d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 319d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 320d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 321d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonRegisterContextSP 32252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonOperatingSystemPython::CreateRegisterContextForThread (Thread *thread, addr_t reg_data_addr) 323d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 324b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton RegisterContextSP reg_ctx_sp; 32552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (!m_interpreter || !m_python_object_sp || !thread) 326a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton return reg_ctx_sp; 327a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton 328a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton if (!IsOperatingSystemPluginThread(thread->shared_from_this())) 329a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton return reg_ctx_sp; 330467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton 3314a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham // First thing we have to do is get the API lock, and the run lock. We're going to change the thread 3324a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham // content of the process, and we're going to use python, which requires the API lock to do it. 3334a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham // So get & hold that. This is a recursive lock so we can grant it to any Python code called on the stack below us. 3344a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham Target &target = m_process->GetTarget(); 3354a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham Mutex::Locker api_locker (target.GetAPIMutex()); 3364a96ab8a1d4e2222b9f6e415b97bde6b826f94a4Jim Ingham 337952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD)); 338467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton 339989c6f74bad9acb7580025c1fc35378799c28e43Enrico Granata auto lock = m_interpreter->AcquireInterpreterLock(); // to make sure python objects stays alive 34091a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton if (reg_data_addr != LLDB_INVALID_ADDRESS) 341b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton { 34291a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton // The registers data is in contiguous memory, just create the register 34391a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton // context using the address provided 34491a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton if (log) 345a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton log->Printf ("OperatingSystemPython::CreateRegisterContextForThread (tid = 0x%" PRIx64 ", 0x%" PRIx64 ", reg_data_addr = 0x%" PRIx64 ") creating memory register context", 346a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton thread->GetID(), 347a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton thread->GetProtocolID(), 348a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton reg_data_addr); 34991a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton reg_ctx_sp.reset (new RegisterContextMemory (*thread, 0, *GetDynamicRegisterInfo (), reg_data_addr)); 35091a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton } 35191a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton else 35291a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton { 35391a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton // No register data address is provided, query the python plug-in to let 35491a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton // it make up the data as it sees fit 35591a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton if (log) 356a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton log->Printf ("OperatingSystemPython::CreateRegisterContextForThread (tid = 0x%" PRIx64 ", 0x%" PRIx64 ") fetching register data from python", 357a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton thread->GetID(), 358a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton thread->GetProtocolID()); 35991a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton 36052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton PythonString reg_context_data(m_interpreter->OSPlugin_RegisterContextData (m_python_object_sp, thread->GetID())); 36191a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton if (reg_context_data) 362b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton { 36391a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton DataBufferSP data_sp (new DataBufferHeap (reg_context_data.GetString(), 36491a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton reg_context_data.GetSize())); 36591a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton if (data_sp->GetByteSize()) 366b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton { 36791a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton RegisterContextMemory *reg_ctx_memory = new RegisterContextMemory (*thread, 0, *GetDynamicRegisterInfo (), LLDB_INVALID_ADDRESS); 36891a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton if (reg_ctx_memory) 36991a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton { 37091a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton reg_ctx_sp.reset(reg_ctx_memory); 37191a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton reg_ctx_memory->SetAllRegisterData (data_sp); 37291a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton } 373b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton } 374b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton } 375b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton } 37649ff4e6008bdeb28de57fa4c931aeb8cc67152d4Enrico Granata // if we still have no register data, fallback on a dummy context to avoid crashing 37749ff4e6008bdeb28de57fa4c931aeb8cc67152d4Enrico Granata if (!reg_ctx_sp) 37849ff4e6008bdeb28de57fa4c931aeb8cc67152d4Enrico Granata { 37949ff4e6008bdeb28de57fa4c931aeb8cc67152d4Enrico Granata if (log) 38049ff4e6008bdeb28de57fa4c931aeb8cc67152d4Enrico Granata log->Printf ("OperatingSystemPython::CreateRegisterContextForThread (tid = 0x%" PRIx64 ") forcing a dummy register context", thread->GetID()); 38149ff4e6008bdeb28de57fa4c931aeb8cc67152d4Enrico Granata reg_ctx_sp.reset(new RegisterContextDummy(*thread,0,target.GetArchitecture().GetAddressByteSize())); 38249ff4e6008bdeb28de57fa4c931aeb8cc67152d4Enrico Granata } 383d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton return reg_ctx_sp; 384d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 385d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 386d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonStopInfoSP 387d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::CreateThreadStopReason (lldb_private::Thread *thread) 388d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{ 389d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton // We should have gotten the thread stop info from the dictionary of data for 390d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton // the thread in the initial call to get_thread_info(), this should have been 391d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton // cached so we can return it here 392d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton StopInfoSP stop_info_sp; //(StopInfo::CreateStopReasonWithSignal (*thread, SIGSTOP)); 393d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton return stop_info_sp; 394d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton} 395d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 39652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonlldb::ThreadSP 39752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonOperatingSystemPython::CreateThread (lldb::tid_t tid, addr_t context) 39852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{ 399952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD)); 40052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton 40152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (log) 40252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton log->Printf ("OperatingSystemPython::CreateThread (tid = 0x%" PRIx64 ", context = 0x%" PRIx64 ") fetching register data from python", tid, context); 40352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton 40452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (m_interpreter && m_python_object_sp) 40552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton { 40652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton // First thing we have to do is get the API lock, and the run lock. We're going to change the thread 40752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton // content of the process, and we're going to use python, which requires the API lock to do it. 40852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton // So get & hold that. This is a recursive lock so we can grant it to any Python code called on the stack below us. 40952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton Target &target = m_process->GetTarget(); 41052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton Mutex::Locker api_locker (target.GetAPIMutex()); 41152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton 412989c6f74bad9acb7580025c1fc35378799c28e43Enrico Granata auto lock = m_interpreter->AcquireInterpreterLock(); // to make sure thread_info_dict stays alive 41352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton PythonDictionary thread_info_dict (m_interpreter->OSPlugin_CreateThread(m_python_object_sp, tid, context)); 41452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (thread_info_dict) 41552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton { 4169acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton ThreadList core_threads(m_process); 41752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton ThreadList &thread_list = m_process->GetThreadList(); 41852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton bool did_create = false; 4199acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton ThreadSP thread_sp (CreateThreadFromThreadInfo (thread_info_dict, core_threads, thread_list, &did_create)); 42052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (did_create) 42152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton thread_list.AddThread(thread_sp); 42252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton return thread_sp; 42352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton } 42452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton } 42552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton return ThreadSP(); 42652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton} 42752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton 42852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton 429d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton 430d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#endif // #ifndef LLDB_DISABLE_PYTHON 431