130fdc8d8SChris Lattner //===-- TargetList.cpp ------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner // C Includes 1130fdc8d8SChris Lattner // C++ Includes 1230fdc8d8SChris Lattner // Other libraries and framework includes 1330fdc8d8SChris Lattner // Project includes 1430fdc8d8SChris Lattner #include "lldb/Core/Broadcaster.h" 15ded470d3SGreg Clayton #include "lldb/Core/Debugger.h" 1630fdc8d8SChris Lattner #include "lldb/Core/Event.h" 1730fdc8d8SChris Lattner #include "lldb/Core/State.h" 1830fdc8d8SChris Lattner #include "lldb/Core/Timer.h" 1930fdc8d8SChris Lattner #include "lldb/Host/Host.h" 20b3a40ba8SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 21cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h" 22e996fd30SGreg Clayton #include "lldb/Target/Platform.h" 2330fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2430fdc8d8SChris Lattner #include "lldb/Target/TargetList.h" 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner using namespace lldb; 2730fdc8d8SChris Lattner using namespace lldb_private; 2830fdc8d8SChris Lattner 294bddaeb5SJim Ingham ConstString & 304bddaeb5SJim Ingham TargetList::GetStaticBroadcasterClass () 314bddaeb5SJim Ingham { 324bddaeb5SJim Ingham static ConstString class_name ("lldb.targetList"); 334bddaeb5SJim Ingham return class_name; 344bddaeb5SJim Ingham } 3530fdc8d8SChris Lattner 3630fdc8d8SChris Lattner //---------------------------------------------------------------------- 3730fdc8d8SChris Lattner // TargetList constructor 3830fdc8d8SChris Lattner //---------------------------------------------------------------------- 394bddaeb5SJim Ingham TargetList::TargetList(Debugger &debugger) : 404bddaeb5SJim Ingham Broadcaster(&debugger, "TargetList"), 4130fdc8d8SChris Lattner m_target_list(), 4230fdc8d8SChris Lattner m_target_list_mutex (Mutex::eMutexTypeRecursive), 432976d00aSJim Ingham m_selected_target_idx (0) 4430fdc8d8SChris Lattner { 454bddaeb5SJim Ingham CheckInWithManager(); 4630fdc8d8SChris Lattner } 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner //---------------------------------------------------------------------- 4930fdc8d8SChris Lattner // Destructor 5030fdc8d8SChris Lattner //---------------------------------------------------------------------- 5130fdc8d8SChris Lattner TargetList::~TargetList() 5230fdc8d8SChris Lattner { 5330fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 5430fdc8d8SChris Lattner m_target_list.clear(); 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner Error 58cac9c5f9SGreg Clayton TargetList::CreateTarget (Debugger &debugger, 59cac9c5f9SGreg Clayton const FileSpec& file, 60cac9c5f9SGreg Clayton const char *triple_cstr, 61cac9c5f9SGreg Clayton bool get_dependent_files, 62cac9c5f9SGreg Clayton const OptionGroupPlatform *platform_options, 63cac9c5f9SGreg Clayton TargetSP &target_sp) 64cac9c5f9SGreg Clayton { 65cac9c5f9SGreg Clayton Error error; 66cac9c5f9SGreg Clayton PlatformSP platform_sp; 67cac9c5f9SGreg Clayton 68cdc21d4cSJohnny Chen // This is purposely left empty unless it is specified by triple_cstr. 69cdc21d4cSJohnny Chen // If not initialized via triple_cstr, then the currently selected platform 70cdc21d4cSJohnny Chen // will set the architecture correctly. 7170512317SGreg Clayton const ArchSpec arch(triple_cstr); 7270512317SGreg Clayton if (triple_cstr && triple_cstr[0]) 73cac9c5f9SGreg Clayton { 74cac9c5f9SGreg Clayton if (!arch.IsValid()) 75cac9c5f9SGreg Clayton { 7686edbf41SGreg Clayton error.SetErrorStringWithFormat("invalid triple '%s'", triple_cstr); 77cac9c5f9SGreg Clayton return error; 78cac9c5f9SGreg Clayton } 79cac9c5f9SGreg Clayton } 80b3a40ba8SGreg Clayton 8170512317SGreg Clayton ArchSpec platform_arch(arch); 82b3a40ba8SGreg Clayton CommandInterpreter &interpreter = debugger.GetCommandInterpreter(); 83b3a40ba8SGreg Clayton if (platform_options) 84b3a40ba8SGreg Clayton { 85b3a40ba8SGreg Clayton if (platform_options->PlatformWasSpecified ()) 86b3a40ba8SGreg Clayton { 87b3a40ba8SGreg Clayton const bool select_platform = true; 88b3a40ba8SGreg Clayton platform_sp = platform_options->CreatePlatformWithOptions (interpreter, 89b3a40ba8SGreg Clayton arch, 90b3a40ba8SGreg Clayton select_platform, 9170512317SGreg Clayton error, 9270512317SGreg Clayton platform_arch); 93b3a40ba8SGreg Clayton if (!platform_sp) 94b3a40ba8SGreg Clayton return error; 95b3a40ba8SGreg Clayton } 96b3a40ba8SGreg Clayton } 97b3a40ba8SGreg Clayton 98b3a40ba8SGreg Clayton if (!platform_sp) 99b3a40ba8SGreg Clayton { 100b3a40ba8SGreg Clayton // Get the current platform and make sure it is compatible with the 101b3a40ba8SGreg Clayton // current architecture if we have a valid architecture. 102b3a40ba8SGreg Clayton platform_sp = debugger.GetPlatformList().GetSelectedPlatform (); 103b3a40ba8SGreg Clayton 10470512317SGreg Clayton if (arch.IsValid() && !platform_sp->IsCompatibleArchitecture(arch, &platform_arch)) 105b3a40ba8SGreg Clayton { 10670512317SGreg Clayton platform_sp = Platform::GetPlatformForArchitecture(arch, &platform_arch); 107b3a40ba8SGreg Clayton } 108b3a40ba8SGreg Clayton } 109b3a40ba8SGreg Clayton 11070512317SGreg Clayton if (!platform_arch.IsValid()) 11170512317SGreg Clayton platform_arch = arch; 11270512317SGreg Clayton 113cac9c5f9SGreg Clayton error = TargetList::CreateTarget (debugger, 114cac9c5f9SGreg Clayton file, 11570512317SGreg Clayton platform_arch, 116cac9c5f9SGreg Clayton get_dependent_files, 117cac9c5f9SGreg Clayton platform_sp, 118cac9c5f9SGreg Clayton target_sp); 119c859e2d5SGreg Clayton 120c859e2d5SGreg Clayton if (target_sp) 121c859e2d5SGreg Clayton { 122c859e2d5SGreg Clayton if (file.GetDirectory()) 123c859e2d5SGreg Clayton { 124c859e2d5SGreg Clayton FileSpec file_dir; 125c859e2d5SGreg Clayton file_dir.GetDirectory() = file.GetDirectory(); 126c859e2d5SGreg Clayton target_sp->GetExecutableSearchPaths ().Append (file_dir); 127c859e2d5SGreg Clayton } 128c859e2d5SGreg Clayton } 129cac9c5f9SGreg Clayton return error; 130cac9c5f9SGreg Clayton } 131cac9c5f9SGreg Clayton 132cac9c5f9SGreg Clayton Error 13330fdc8d8SChris Lattner TargetList::CreateTarget 13430fdc8d8SChris Lattner ( 1356611103cSGreg Clayton Debugger &debugger, 13630fdc8d8SChris Lattner const FileSpec& file, 13770512317SGreg Clayton const ArchSpec& specified_arch, 13830fdc8d8SChris Lattner bool get_dependent_files, 139b3a40ba8SGreg Clayton PlatformSP &platform_sp, 14030fdc8d8SChris Lattner TargetSP &target_sp 14130fdc8d8SChris Lattner ) 14230fdc8d8SChris Lattner { 14330fdc8d8SChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 144e996fd30SGreg Clayton "TargetList::CreateTarget (file = '%s/%s', arch = '%s')", 14530fdc8d8SChris Lattner file.GetDirectory().AsCString(), 14630fdc8d8SChris Lattner file.GetFilename().AsCString(), 14770512317SGreg Clayton specified_arch.GetArchitectureName()); 1485aee162fSJim Ingham Error error; 1495aee162fSJim Ingham 15070512317SGreg Clayton ArchSpec arch(specified_arch); 15170512317SGreg Clayton 15270512317SGreg Clayton if (platform_sp) 15370512317SGreg Clayton { 15470512317SGreg Clayton if (arch.IsValid()) 15570512317SGreg Clayton { 15670512317SGreg Clayton if (!platform_sp->IsCompatibleArchitecture(arch)) 15770512317SGreg Clayton platform_sp = Platform::GetPlatformForArchitecture(specified_arch, &arch); 15870512317SGreg Clayton } 15970512317SGreg Clayton } 16070512317SGreg Clayton else if (arch.IsValid()) 16170512317SGreg Clayton { 16270512317SGreg Clayton platform_sp = Platform::GetPlatformForArchitecture(specified_arch, &arch); 16370512317SGreg Clayton } 16470512317SGreg Clayton 16570512317SGreg Clayton if (!platform_sp) 16670512317SGreg Clayton platform_sp = debugger.GetPlatformList().GetSelectedPlatform(); 167ded470d3SGreg Clayton 1688ae50eb4SGreg Clayton if (!arch.IsValid()) 1698ae50eb4SGreg Clayton arch = specified_arch; 1708ae50eb4SGreg Clayton 1718ae50eb4SGreg Clayton 172e996fd30SGreg Clayton if (file) 1735aee162fSJim Ingham { 17430fdc8d8SChris Lattner ModuleSP exe_module_sp; 17530fdc8d8SChris Lattner FileSpec resolved_file(file); 176e996fd30SGreg Clayton if (platform_sp) 177c859e2d5SGreg Clayton { 178c859e2d5SGreg Clayton FileSpecList executable_search_paths (Target::GetDefaultExecutableSearchPaths()); 17970512317SGreg Clayton error = platform_sp->ResolveExecutable (file, 18070512317SGreg Clayton arch, 181c859e2d5SGreg Clayton exe_module_sp, 182c859e2d5SGreg Clayton executable_search_paths.GetSize() ? &executable_search_paths : NULL); 183c859e2d5SGreg Clayton } 184428a9a58SCaroline Tice 185e996fd30SGreg Clayton if (error.Success() && exe_module_sp) 18630fdc8d8SChris Lattner { 1875aee162fSJim Ingham if (exe_module_sp->GetObjectFile() == NULL) 1885aee162fSJim Ingham { 189bc5cad6cSGreg Clayton if (arch.IsValid()) 190bc5cad6cSGreg Clayton { 191bc5cad6cSGreg Clayton error.SetErrorStringWithFormat("\"%s%s%s\" doesn't contain architecture %s", 1925aee162fSJim Ingham file.GetDirectory().AsCString(), 1935aee162fSJim Ingham file.GetDirectory() ? "/" : "", 1945aee162fSJim Ingham file.GetFilename().AsCString(), 19564195a2cSGreg Clayton arch.GetArchitectureName()); 196bc5cad6cSGreg Clayton } 197bc5cad6cSGreg Clayton else 198bc5cad6cSGreg Clayton { 199bc5cad6cSGreg Clayton error.SetErrorStringWithFormat("unsupported file type \"%s%s%s\"", 200bc5cad6cSGreg Clayton file.GetDirectory().AsCString(), 201bc5cad6cSGreg Clayton file.GetDirectory() ? "/" : "", 202bc5cad6cSGreg Clayton file.GetFilename().AsCString()); 203bc5cad6cSGreg Clayton } 2045aee162fSJim Ingham return error; 2055aee162fSJim Ingham } 20632e0a750SGreg Clayton target_sp.reset(new Target(debugger, arch, platform_sp)); 20730fdc8d8SChris Lattner target_sp->SetExecutableModule (exe_module_sp, get_dependent_files); 2085aee162fSJim Ingham } 2095aee162fSJim Ingham } 210e996fd30SGreg Clayton else 211e996fd30SGreg Clayton { 212e996fd30SGreg Clayton // No file was specified, just create an empty target with any arch 213e996fd30SGreg Clayton // if a valid arch was specified 21432e0a750SGreg Clayton target_sp.reset(new Target(debugger, arch, platform_sp)); 215e996fd30SGreg Clayton } 2161559a46bSCaroline Tice 217e996fd30SGreg Clayton if (target_sp) 218e996fd30SGreg Clayton { 2191559a46bSCaroline Tice target_sp->UpdateInstanceName(); 22030fdc8d8SChris Lattner 22130fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 2222976d00aSJim Ingham m_selected_target_idx = m_target_list.size(); 22330fdc8d8SChris Lattner m_target_list.push_back(target_sp); 22430fdc8d8SChris Lattner } 22530fdc8d8SChris Lattner 22630fdc8d8SChris Lattner return error; 22730fdc8d8SChris Lattner } 22830fdc8d8SChris Lattner 22930fdc8d8SChris Lattner bool 23030fdc8d8SChris Lattner TargetList::DeleteTarget (TargetSP &target_sp) 23130fdc8d8SChris Lattner { 23230fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 23330fdc8d8SChris Lattner collection::iterator pos, end = m_target_list.end(); 23430fdc8d8SChris Lattner 23530fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 23630fdc8d8SChris Lattner { 23730fdc8d8SChris Lattner if (pos->get() == target_sp.get()) 23830fdc8d8SChris Lattner { 23930fdc8d8SChris Lattner m_target_list.erase(pos); 24030fdc8d8SChris Lattner return true; 24130fdc8d8SChris Lattner } 24230fdc8d8SChris Lattner } 24330fdc8d8SChris Lattner return false; 24430fdc8d8SChris Lattner } 24530fdc8d8SChris Lattner 24630fdc8d8SChris Lattner 24730fdc8d8SChris Lattner TargetSP 24830fdc8d8SChris Lattner TargetList::FindTargetWithExecutableAndArchitecture 24930fdc8d8SChris Lattner ( 25030fdc8d8SChris Lattner const FileSpec &exe_file_spec, 25130fdc8d8SChris Lattner const ArchSpec *exe_arch_ptr 25230fdc8d8SChris Lattner ) const 25330fdc8d8SChris Lattner { 25430fdc8d8SChris Lattner Mutex::Locker locker (m_target_list_mutex); 25530fdc8d8SChris Lattner TargetSP target_sp; 25630fdc8d8SChris Lattner bool full_match = exe_file_spec.GetDirectory(); 25730fdc8d8SChris Lattner 25830fdc8d8SChris Lattner collection::const_iterator pos, end = m_target_list.end(); 25930fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 26030fdc8d8SChris Lattner { 261aa149cbdSGreg Clayton Module *exe_module = (*pos)->GetExecutableModulePointer(); 26230fdc8d8SChris Lattner 263aa149cbdSGreg Clayton if (exe_module) 26430fdc8d8SChris Lattner { 265aa149cbdSGreg Clayton if (FileSpec::Equal (exe_file_spec, exe_module->GetFileSpec(), full_match)) 26630fdc8d8SChris Lattner { 26730fdc8d8SChris Lattner if (exe_arch_ptr) 26830fdc8d8SChris Lattner { 269aa149cbdSGreg Clayton if (*exe_arch_ptr != exe_module->GetArchitecture()) 27030fdc8d8SChris Lattner continue; 27130fdc8d8SChris Lattner } 27230fdc8d8SChris Lattner target_sp = *pos; 27330fdc8d8SChris Lattner break; 27430fdc8d8SChris Lattner } 27530fdc8d8SChris Lattner } 27630fdc8d8SChris Lattner } 27730fdc8d8SChris Lattner return target_sp; 27830fdc8d8SChris Lattner } 27930fdc8d8SChris Lattner 28030fdc8d8SChris Lattner TargetSP 28130fdc8d8SChris Lattner TargetList::FindTargetWithProcessID (lldb::pid_t pid) const 28230fdc8d8SChris Lattner { 28330fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 28430fdc8d8SChris Lattner TargetSP target_sp; 28530fdc8d8SChris Lattner collection::const_iterator pos, end = m_target_list.end(); 28630fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 28730fdc8d8SChris Lattner { 28830fdc8d8SChris Lattner Process* process = (*pos)->GetProcessSP().get(); 28930fdc8d8SChris Lattner if (process && process->GetID() == pid) 29030fdc8d8SChris Lattner { 29130fdc8d8SChris Lattner target_sp = *pos; 29230fdc8d8SChris Lattner break; 29330fdc8d8SChris Lattner } 29430fdc8d8SChris Lattner } 29530fdc8d8SChris Lattner return target_sp; 29630fdc8d8SChris Lattner } 29730fdc8d8SChris Lattner 29830fdc8d8SChris Lattner 29930fdc8d8SChris Lattner TargetSP 30030fdc8d8SChris Lattner TargetList::FindTargetWithProcess (Process *process) const 30130fdc8d8SChris Lattner { 30230fdc8d8SChris Lattner TargetSP target_sp; 30330fdc8d8SChris Lattner if (process) 30430fdc8d8SChris Lattner { 30530fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 30630fdc8d8SChris Lattner collection::const_iterator pos, end = m_target_list.end(); 30730fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 30830fdc8d8SChris Lattner { 30930fdc8d8SChris Lattner if (process == (*pos)->GetProcessSP().get()) 31030fdc8d8SChris Lattner { 31130fdc8d8SChris Lattner target_sp = *pos; 31230fdc8d8SChris Lattner break; 31330fdc8d8SChris Lattner } 31430fdc8d8SChris Lattner } 31530fdc8d8SChris Lattner } 31630fdc8d8SChris Lattner return target_sp; 31730fdc8d8SChris Lattner } 31830fdc8d8SChris Lattner 31930fdc8d8SChris Lattner TargetSP 32030fdc8d8SChris Lattner TargetList::GetTargetSP (Target *target) const 32130fdc8d8SChris Lattner { 32230fdc8d8SChris Lattner TargetSP target_sp; 32330fdc8d8SChris Lattner if (target) 32430fdc8d8SChris Lattner { 32530fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 32630fdc8d8SChris Lattner collection::const_iterator pos, end = m_target_list.end(); 32730fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 32830fdc8d8SChris Lattner { 32930fdc8d8SChris Lattner if (target == (*pos).get()) 33030fdc8d8SChris Lattner { 33130fdc8d8SChris Lattner target_sp = *pos; 33230fdc8d8SChris Lattner break; 33330fdc8d8SChris Lattner } 33430fdc8d8SChris Lattner } 33530fdc8d8SChris Lattner } 33630fdc8d8SChris Lattner return target_sp; 33730fdc8d8SChris Lattner } 33830fdc8d8SChris Lattner 33930fdc8d8SChris Lattner uint32_t 34030fdc8d8SChris Lattner TargetList::SendAsyncInterrupt (lldb::pid_t pid) 34130fdc8d8SChris Lattner { 34230fdc8d8SChris Lattner uint32_t num_async_interrupts_sent = 0; 34330fdc8d8SChris Lattner 34430fdc8d8SChris Lattner if (pid != LLDB_INVALID_PROCESS_ID) 34530fdc8d8SChris Lattner { 34630fdc8d8SChris Lattner TargetSP target_sp(FindTargetWithProcessID (pid)); 34730fdc8d8SChris Lattner if (target_sp.get()) 34830fdc8d8SChris Lattner { 34930fdc8d8SChris Lattner Process* process = target_sp->GetProcessSP().get(); 35030fdc8d8SChris Lattner if (process) 35130fdc8d8SChris Lattner { 352*cfc0935eSJim Ingham process->SendAsyncInterrupt(); 35330fdc8d8SChris Lattner ++num_async_interrupts_sent; 35430fdc8d8SChris Lattner } 35530fdc8d8SChris Lattner } 35630fdc8d8SChris Lattner } 35730fdc8d8SChris Lattner else 35830fdc8d8SChris Lattner { 35930fdc8d8SChris Lattner // We don't have a valid pid to broadcast to, so broadcast to the target 36030fdc8d8SChris Lattner // list's async broadcaster... 36130fdc8d8SChris Lattner BroadcastEvent (Process::eBroadcastBitInterrupt, NULL); 36230fdc8d8SChris Lattner } 36330fdc8d8SChris Lattner 36430fdc8d8SChris Lattner return num_async_interrupts_sent; 36530fdc8d8SChris Lattner } 36630fdc8d8SChris Lattner 36730fdc8d8SChris Lattner uint32_t 36830fdc8d8SChris Lattner TargetList::SignalIfRunning (lldb::pid_t pid, int signo) 36930fdc8d8SChris Lattner { 37030fdc8d8SChris Lattner uint32_t num_signals_sent = 0; 37130fdc8d8SChris Lattner Process *process = NULL; 37230fdc8d8SChris Lattner if (pid == LLDB_INVALID_PROCESS_ID) 37330fdc8d8SChris Lattner { 37430fdc8d8SChris Lattner // Signal all processes with signal 37530fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 37630fdc8d8SChris Lattner collection::iterator pos, end = m_target_list.end(); 37730fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 37830fdc8d8SChris Lattner { 37930fdc8d8SChris Lattner process = (*pos)->GetProcessSP().get(); 38030fdc8d8SChris Lattner if (process) 38130fdc8d8SChris Lattner { 38230fdc8d8SChris Lattner if (process->IsAlive()) 38330fdc8d8SChris Lattner { 38430fdc8d8SChris Lattner ++num_signals_sent; 38530fdc8d8SChris Lattner process->Signal (signo); 38630fdc8d8SChris Lattner } 38730fdc8d8SChris Lattner } 38830fdc8d8SChris Lattner } 38930fdc8d8SChris Lattner } 39030fdc8d8SChris Lattner else 39130fdc8d8SChris Lattner { 39230fdc8d8SChris Lattner // Signal a specific process with signal 39330fdc8d8SChris Lattner TargetSP target_sp(FindTargetWithProcessID (pid)); 39430fdc8d8SChris Lattner if (target_sp.get()) 39530fdc8d8SChris Lattner { 39630fdc8d8SChris Lattner process = target_sp->GetProcessSP().get(); 39730fdc8d8SChris Lattner if (process) 39830fdc8d8SChris Lattner { 39930fdc8d8SChris Lattner if (process->IsAlive()) 40030fdc8d8SChris Lattner { 40130fdc8d8SChris Lattner ++num_signals_sent; 40230fdc8d8SChris Lattner process->Signal (signo); 40330fdc8d8SChris Lattner } 40430fdc8d8SChris Lattner } 40530fdc8d8SChris Lattner } 40630fdc8d8SChris Lattner } 40730fdc8d8SChris Lattner return num_signals_sent; 40830fdc8d8SChris Lattner } 40930fdc8d8SChris Lattner 41030fdc8d8SChris Lattner int 41130fdc8d8SChris Lattner TargetList::GetNumTargets () const 41230fdc8d8SChris Lattner { 41330fdc8d8SChris Lattner Mutex::Locker locker (m_target_list_mutex); 41430fdc8d8SChris Lattner return m_target_list.size(); 41530fdc8d8SChris Lattner } 41630fdc8d8SChris Lattner 41730fdc8d8SChris Lattner lldb::TargetSP 41830fdc8d8SChris Lattner TargetList::GetTargetAtIndex (uint32_t idx) const 41930fdc8d8SChris Lattner { 42030fdc8d8SChris Lattner TargetSP target_sp; 42130fdc8d8SChris Lattner Mutex::Locker locker (m_target_list_mutex); 42230fdc8d8SChris Lattner if (idx < m_target_list.size()) 42330fdc8d8SChris Lattner target_sp = m_target_list[idx]; 42430fdc8d8SChris Lattner return target_sp; 42530fdc8d8SChris Lattner } 42630fdc8d8SChris Lattner 42730fdc8d8SChris Lattner uint32_t 4288499e1a4SJim Ingham TargetList::GetIndexOfTarget (lldb::TargetSP target_sp) const 4298499e1a4SJim Ingham { 4308499e1a4SJim Ingham Mutex::Locker locker (m_target_list_mutex); 4318499e1a4SJim Ingham size_t num_targets = m_target_list.size(); 4328499e1a4SJim Ingham for (size_t idx = 0; idx < num_targets; idx++) 4338499e1a4SJim Ingham { 4348499e1a4SJim Ingham if (target_sp == m_target_list[idx]) 4358499e1a4SJim Ingham return idx; 4368499e1a4SJim Ingham } 4378499e1a4SJim Ingham return UINT32_MAX; 4388499e1a4SJim Ingham } 4398499e1a4SJim Ingham 4408499e1a4SJim Ingham uint32_t 4412976d00aSJim Ingham TargetList::SetSelectedTarget (Target* target) 44230fdc8d8SChris Lattner { 44330fdc8d8SChris Lattner Mutex::Locker locker (m_target_list_mutex); 44430fdc8d8SChris Lattner collection::const_iterator pos, 44530fdc8d8SChris Lattner begin = m_target_list.begin(), 44630fdc8d8SChris Lattner end = m_target_list.end(); 44730fdc8d8SChris Lattner for (pos = begin; pos != end; ++pos) 44830fdc8d8SChris Lattner { 44930fdc8d8SChris Lattner if (pos->get() == target) 45030fdc8d8SChris Lattner { 4512976d00aSJim Ingham m_selected_target_idx = std::distance (begin, pos); 4522976d00aSJim Ingham return m_selected_target_idx; 45330fdc8d8SChris Lattner } 45430fdc8d8SChris Lattner } 4552976d00aSJim Ingham m_selected_target_idx = 0; 4562976d00aSJim Ingham return m_selected_target_idx; 45730fdc8d8SChris Lattner } 45830fdc8d8SChris Lattner 45930fdc8d8SChris Lattner lldb::TargetSP 4602976d00aSJim Ingham TargetList::GetSelectedTarget () 46130fdc8d8SChris Lattner { 46230fdc8d8SChris Lattner Mutex::Locker locker (m_target_list_mutex); 4632976d00aSJim Ingham if (m_selected_target_idx >= m_target_list.size()) 4642976d00aSJim Ingham m_selected_target_idx = 0; 4652976d00aSJim Ingham return GetTargetAtIndex (m_selected_target_idx); 46630fdc8d8SChris Lattner } 467