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" 171f746071SGreg Clayton #include "lldb/Core/Module.h" 1830fdc8d8SChris Lattner #include "lldb/Core/State.h" 1930fdc8d8SChris Lattner #include "lldb/Core/Timer.h" 2030fdc8d8SChris Lattner #include "lldb/Host/Host.h" 21b3a40ba8SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 22cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h" 23e996fd30SGreg Clayton #include "lldb/Target/Platform.h" 2430fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2530fdc8d8SChris Lattner #include "lldb/Target/TargetList.h" 2630fdc8d8SChris Lattner 2730fdc8d8SChris Lattner using namespace lldb; 2830fdc8d8SChris Lattner using namespace lldb_private; 2930fdc8d8SChris Lattner 304bddaeb5SJim Ingham ConstString & 314bddaeb5SJim Ingham TargetList::GetStaticBroadcasterClass () 324bddaeb5SJim Ingham { 334bddaeb5SJim Ingham static ConstString class_name ("lldb.targetList"); 344bddaeb5SJim Ingham return class_name; 354bddaeb5SJim Ingham } 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner //---------------------------------------------------------------------- 3830fdc8d8SChris Lattner // TargetList constructor 3930fdc8d8SChris Lattner //---------------------------------------------------------------------- 404bddaeb5SJim Ingham TargetList::TargetList(Debugger &debugger) : 41*4f465cffSJim Ingham Broadcaster(&debugger, TargetList::GetStaticBroadcasterClass().AsCString()), 4230fdc8d8SChris Lattner m_target_list(), 4330fdc8d8SChris Lattner m_target_list_mutex (Mutex::eMutexTypeRecursive), 442976d00aSJim Ingham m_selected_target_idx (0) 4530fdc8d8SChris Lattner { 464bddaeb5SJim Ingham CheckInWithManager(); 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner //---------------------------------------------------------------------- 5030fdc8d8SChris Lattner // Destructor 5130fdc8d8SChris Lattner //---------------------------------------------------------------------- 5230fdc8d8SChris Lattner TargetList::~TargetList() 5330fdc8d8SChris Lattner { 5430fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 5530fdc8d8SChris Lattner m_target_list.clear(); 5630fdc8d8SChris Lattner } 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner Error 59cac9c5f9SGreg Clayton TargetList::CreateTarget (Debugger &debugger, 60cac9c5f9SGreg Clayton const FileSpec& file, 61cac9c5f9SGreg Clayton const char *triple_cstr, 62cac9c5f9SGreg Clayton bool get_dependent_files, 63cac9c5f9SGreg Clayton const OptionGroupPlatform *platform_options, 64cac9c5f9SGreg Clayton TargetSP &target_sp) 65cac9c5f9SGreg Clayton { 66cac9c5f9SGreg Clayton Error error; 67cac9c5f9SGreg Clayton PlatformSP platform_sp; 68cac9c5f9SGreg Clayton 69cdc21d4cSJohnny Chen // This is purposely left empty unless it is specified by triple_cstr. 70cdc21d4cSJohnny Chen // If not initialized via triple_cstr, then the currently selected platform 71cdc21d4cSJohnny Chen // will set the architecture correctly. 7270512317SGreg Clayton const ArchSpec arch(triple_cstr); 7370512317SGreg Clayton if (triple_cstr && triple_cstr[0]) 74cac9c5f9SGreg Clayton { 75cac9c5f9SGreg Clayton if (!arch.IsValid()) 76cac9c5f9SGreg Clayton { 7786edbf41SGreg Clayton error.SetErrorStringWithFormat("invalid triple '%s'", triple_cstr); 78cac9c5f9SGreg Clayton return error; 79cac9c5f9SGreg Clayton } 80cac9c5f9SGreg Clayton } 81b3a40ba8SGreg Clayton 8270512317SGreg Clayton ArchSpec platform_arch(arch); 83b3a40ba8SGreg Clayton CommandInterpreter &interpreter = debugger.GetCommandInterpreter(); 84b3a40ba8SGreg Clayton if (platform_options) 85b3a40ba8SGreg Clayton { 86b3a40ba8SGreg Clayton if (platform_options->PlatformWasSpecified ()) 87b3a40ba8SGreg Clayton { 88b3a40ba8SGreg Clayton const bool select_platform = true; 89b3a40ba8SGreg Clayton platform_sp = platform_options->CreatePlatformWithOptions (interpreter, 90b3a40ba8SGreg Clayton arch, 91b3a40ba8SGreg Clayton select_platform, 9270512317SGreg Clayton error, 9370512317SGreg Clayton platform_arch); 94b3a40ba8SGreg Clayton if (!platform_sp) 95b3a40ba8SGreg Clayton return error; 96b3a40ba8SGreg Clayton } 97b3a40ba8SGreg Clayton } 98b3a40ba8SGreg Clayton 99b3a40ba8SGreg Clayton if (!platform_sp) 100b3a40ba8SGreg Clayton { 101b3a40ba8SGreg Clayton // Get the current platform and make sure it is compatible with the 102b3a40ba8SGreg Clayton // current architecture if we have a valid architecture. 103b3a40ba8SGreg Clayton platform_sp = debugger.GetPlatformList().GetSelectedPlatform (); 104b3a40ba8SGreg Clayton 10570512317SGreg Clayton if (arch.IsValid() && !platform_sp->IsCompatibleArchitecture(arch, &platform_arch)) 106b3a40ba8SGreg Clayton { 10770512317SGreg Clayton platform_sp = Platform::GetPlatformForArchitecture(arch, &platform_arch); 108b3a40ba8SGreg Clayton } 109b3a40ba8SGreg Clayton } 110b3a40ba8SGreg Clayton 11170512317SGreg Clayton if (!platform_arch.IsValid()) 11270512317SGreg Clayton platform_arch = arch; 11370512317SGreg Clayton 114cac9c5f9SGreg Clayton error = TargetList::CreateTarget (debugger, 115cac9c5f9SGreg Clayton file, 11670512317SGreg Clayton platform_arch, 117cac9c5f9SGreg Clayton get_dependent_files, 118cac9c5f9SGreg Clayton platform_sp, 119cac9c5f9SGreg Clayton target_sp); 120c859e2d5SGreg Clayton 121c859e2d5SGreg Clayton if (target_sp) 122c859e2d5SGreg Clayton { 123c859e2d5SGreg Clayton if (file.GetDirectory()) 124c859e2d5SGreg Clayton { 125c859e2d5SGreg Clayton FileSpec file_dir; 126c859e2d5SGreg Clayton file_dir.GetDirectory() = file.GetDirectory(); 127c859e2d5SGreg Clayton target_sp->GetExecutableSearchPaths ().Append (file_dir); 128c859e2d5SGreg Clayton } 129c859e2d5SGreg Clayton } 130cac9c5f9SGreg Clayton return error; 131cac9c5f9SGreg Clayton } 132cac9c5f9SGreg Clayton 133cac9c5f9SGreg Clayton Error 13430fdc8d8SChris Lattner TargetList::CreateTarget 13530fdc8d8SChris Lattner ( 1366611103cSGreg Clayton Debugger &debugger, 13730fdc8d8SChris Lattner const FileSpec& file, 13870512317SGreg Clayton const ArchSpec& specified_arch, 13930fdc8d8SChris Lattner bool get_dependent_files, 140b3a40ba8SGreg Clayton PlatformSP &platform_sp, 14130fdc8d8SChris Lattner TargetSP &target_sp 14230fdc8d8SChris Lattner ) 14330fdc8d8SChris Lattner { 14430fdc8d8SChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 145e996fd30SGreg Clayton "TargetList::CreateTarget (file = '%s/%s', arch = '%s')", 14630fdc8d8SChris Lattner file.GetDirectory().AsCString(), 14730fdc8d8SChris Lattner file.GetFilename().AsCString(), 14870512317SGreg Clayton specified_arch.GetArchitectureName()); 1495aee162fSJim Ingham Error error; 1505aee162fSJim Ingham 15170512317SGreg Clayton ArchSpec arch(specified_arch); 15270512317SGreg Clayton 15370512317SGreg Clayton if (platform_sp) 15470512317SGreg Clayton { 15570512317SGreg Clayton if (arch.IsValid()) 15670512317SGreg Clayton { 15770512317SGreg Clayton if (!platform_sp->IsCompatibleArchitecture(arch)) 15870512317SGreg Clayton platform_sp = Platform::GetPlatformForArchitecture(specified_arch, &arch); 15970512317SGreg Clayton } 16070512317SGreg Clayton } 16170512317SGreg Clayton else if (arch.IsValid()) 16270512317SGreg Clayton { 16370512317SGreg Clayton platform_sp = Platform::GetPlatformForArchitecture(specified_arch, &arch); 16470512317SGreg Clayton } 16570512317SGreg Clayton 16670512317SGreg Clayton if (!platform_sp) 16770512317SGreg Clayton platform_sp = debugger.GetPlatformList().GetSelectedPlatform(); 168ded470d3SGreg Clayton 1698ae50eb4SGreg Clayton if (!arch.IsValid()) 1708ae50eb4SGreg Clayton arch = specified_arch; 1718ae50eb4SGreg Clayton 1728ae50eb4SGreg Clayton 173e996fd30SGreg Clayton if (file) 1745aee162fSJim Ingham { 17530fdc8d8SChris Lattner ModuleSP exe_module_sp; 17630fdc8d8SChris Lattner FileSpec resolved_file(file); 177e996fd30SGreg Clayton if (platform_sp) 178c859e2d5SGreg Clayton { 179c859e2d5SGreg Clayton FileSpecList executable_search_paths (Target::GetDefaultExecutableSearchPaths()); 18070512317SGreg Clayton error = platform_sp->ResolveExecutable (file, 18170512317SGreg Clayton arch, 182c859e2d5SGreg Clayton exe_module_sp, 183c859e2d5SGreg Clayton executable_search_paths.GetSize() ? &executable_search_paths : NULL); 184c859e2d5SGreg Clayton } 185428a9a58SCaroline Tice 186e996fd30SGreg Clayton if (error.Success() && exe_module_sp) 18730fdc8d8SChris Lattner { 1885aee162fSJim Ingham if (exe_module_sp->GetObjectFile() == NULL) 1895aee162fSJim Ingham { 190bc5cad6cSGreg Clayton if (arch.IsValid()) 191bc5cad6cSGreg Clayton { 192bc5cad6cSGreg Clayton error.SetErrorStringWithFormat("\"%s%s%s\" doesn't contain architecture %s", 1935aee162fSJim Ingham file.GetDirectory().AsCString(), 1945aee162fSJim Ingham file.GetDirectory() ? "/" : "", 1955aee162fSJim Ingham file.GetFilename().AsCString(), 19664195a2cSGreg Clayton arch.GetArchitectureName()); 197bc5cad6cSGreg Clayton } 198bc5cad6cSGreg Clayton else 199bc5cad6cSGreg Clayton { 200bc5cad6cSGreg Clayton error.SetErrorStringWithFormat("unsupported file type \"%s%s%s\"", 201bc5cad6cSGreg Clayton file.GetDirectory().AsCString(), 202bc5cad6cSGreg Clayton file.GetDirectory() ? "/" : "", 203bc5cad6cSGreg Clayton file.GetFilename().AsCString()); 204bc5cad6cSGreg Clayton } 2055aee162fSJim Ingham return error; 2065aee162fSJim Ingham } 20732e0a750SGreg Clayton target_sp.reset(new Target(debugger, arch, platform_sp)); 20830fdc8d8SChris Lattner target_sp->SetExecutableModule (exe_module_sp, get_dependent_files); 2095aee162fSJim Ingham } 2105aee162fSJim Ingham } 211e996fd30SGreg Clayton else 212e996fd30SGreg Clayton { 213e996fd30SGreg Clayton // No file was specified, just create an empty target with any arch 214e996fd30SGreg Clayton // if a valid arch was specified 21532e0a750SGreg Clayton target_sp.reset(new Target(debugger, arch, platform_sp)); 216e996fd30SGreg Clayton } 2171559a46bSCaroline Tice 218e996fd30SGreg Clayton if (target_sp) 219e996fd30SGreg Clayton { 22030fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 2212976d00aSJim Ingham m_selected_target_idx = m_target_list.size(); 22230fdc8d8SChris Lattner m_target_list.push_back(target_sp); 22330fdc8d8SChris Lattner } 22430fdc8d8SChris Lattner 22530fdc8d8SChris Lattner return error; 22630fdc8d8SChris Lattner } 22730fdc8d8SChris Lattner 22830fdc8d8SChris Lattner bool 22930fdc8d8SChris Lattner TargetList::DeleteTarget (TargetSP &target_sp) 23030fdc8d8SChris Lattner { 23130fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 23230fdc8d8SChris Lattner collection::iterator pos, end = m_target_list.end(); 23330fdc8d8SChris Lattner 23430fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 23530fdc8d8SChris Lattner { 23630fdc8d8SChris Lattner if (pos->get() == target_sp.get()) 23730fdc8d8SChris Lattner { 23830fdc8d8SChris Lattner m_target_list.erase(pos); 23930fdc8d8SChris Lattner return true; 24030fdc8d8SChris Lattner } 24130fdc8d8SChris Lattner } 24230fdc8d8SChris Lattner return false; 24330fdc8d8SChris Lattner } 24430fdc8d8SChris Lattner 24530fdc8d8SChris Lattner 24630fdc8d8SChris Lattner TargetSP 24730fdc8d8SChris Lattner TargetList::FindTargetWithExecutableAndArchitecture 24830fdc8d8SChris Lattner ( 24930fdc8d8SChris Lattner const FileSpec &exe_file_spec, 25030fdc8d8SChris Lattner const ArchSpec *exe_arch_ptr 25130fdc8d8SChris Lattner ) const 25230fdc8d8SChris Lattner { 25330fdc8d8SChris Lattner Mutex::Locker locker (m_target_list_mutex); 25430fdc8d8SChris Lattner TargetSP target_sp; 25530fdc8d8SChris Lattner bool full_match = exe_file_spec.GetDirectory(); 25630fdc8d8SChris Lattner 25730fdc8d8SChris Lattner collection::const_iterator pos, end = m_target_list.end(); 25830fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 25930fdc8d8SChris Lattner { 260aa149cbdSGreg Clayton Module *exe_module = (*pos)->GetExecutableModulePointer(); 26130fdc8d8SChris Lattner 262aa149cbdSGreg Clayton if (exe_module) 26330fdc8d8SChris Lattner { 264aa149cbdSGreg Clayton if (FileSpec::Equal (exe_file_spec, exe_module->GetFileSpec(), full_match)) 26530fdc8d8SChris Lattner { 26630fdc8d8SChris Lattner if (exe_arch_ptr) 26730fdc8d8SChris Lattner { 268aa149cbdSGreg Clayton if (*exe_arch_ptr != exe_module->GetArchitecture()) 26930fdc8d8SChris Lattner continue; 27030fdc8d8SChris Lattner } 27130fdc8d8SChris Lattner target_sp = *pos; 27230fdc8d8SChris Lattner break; 27330fdc8d8SChris Lattner } 27430fdc8d8SChris Lattner } 27530fdc8d8SChris Lattner } 27630fdc8d8SChris Lattner return target_sp; 27730fdc8d8SChris Lattner } 27830fdc8d8SChris Lattner 27930fdc8d8SChris Lattner TargetSP 28030fdc8d8SChris Lattner TargetList::FindTargetWithProcessID (lldb::pid_t pid) const 28130fdc8d8SChris Lattner { 28230fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 28330fdc8d8SChris Lattner TargetSP target_sp; 28430fdc8d8SChris Lattner collection::const_iterator pos, end = m_target_list.end(); 28530fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 28630fdc8d8SChris Lattner { 28730fdc8d8SChris Lattner Process* process = (*pos)->GetProcessSP().get(); 28830fdc8d8SChris Lattner if (process && process->GetID() == pid) 28930fdc8d8SChris Lattner { 29030fdc8d8SChris Lattner target_sp = *pos; 29130fdc8d8SChris Lattner break; 29230fdc8d8SChris Lattner } 29330fdc8d8SChris Lattner } 29430fdc8d8SChris Lattner return target_sp; 29530fdc8d8SChris Lattner } 29630fdc8d8SChris Lattner 29730fdc8d8SChris Lattner 29830fdc8d8SChris Lattner TargetSP 29930fdc8d8SChris Lattner TargetList::FindTargetWithProcess (Process *process) const 30030fdc8d8SChris Lattner { 30130fdc8d8SChris Lattner TargetSP target_sp; 30230fdc8d8SChris Lattner if (process) 30330fdc8d8SChris Lattner { 30430fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 30530fdc8d8SChris Lattner collection::const_iterator pos, end = m_target_list.end(); 30630fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 30730fdc8d8SChris Lattner { 30830fdc8d8SChris Lattner if (process == (*pos)->GetProcessSP().get()) 30930fdc8d8SChris Lattner { 31030fdc8d8SChris Lattner target_sp = *pos; 31130fdc8d8SChris Lattner break; 31230fdc8d8SChris Lattner } 31330fdc8d8SChris Lattner } 31430fdc8d8SChris Lattner } 31530fdc8d8SChris Lattner return target_sp; 31630fdc8d8SChris Lattner } 31730fdc8d8SChris Lattner 31830fdc8d8SChris Lattner TargetSP 31930fdc8d8SChris Lattner TargetList::GetTargetSP (Target *target) const 32030fdc8d8SChris Lattner { 32130fdc8d8SChris Lattner TargetSP target_sp; 32230fdc8d8SChris Lattner if (target) 32330fdc8d8SChris Lattner { 32430fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 32530fdc8d8SChris Lattner collection::const_iterator pos, end = m_target_list.end(); 32630fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 32730fdc8d8SChris Lattner { 32830fdc8d8SChris Lattner if (target == (*pos).get()) 32930fdc8d8SChris Lattner { 33030fdc8d8SChris Lattner target_sp = *pos; 33130fdc8d8SChris Lattner break; 33230fdc8d8SChris Lattner } 33330fdc8d8SChris Lattner } 33430fdc8d8SChris Lattner } 33530fdc8d8SChris Lattner return target_sp; 33630fdc8d8SChris Lattner } 33730fdc8d8SChris Lattner 33830fdc8d8SChris Lattner uint32_t 33930fdc8d8SChris Lattner TargetList::SendAsyncInterrupt (lldb::pid_t pid) 34030fdc8d8SChris Lattner { 34130fdc8d8SChris Lattner uint32_t num_async_interrupts_sent = 0; 34230fdc8d8SChris Lattner 34330fdc8d8SChris Lattner if (pid != LLDB_INVALID_PROCESS_ID) 34430fdc8d8SChris Lattner { 34530fdc8d8SChris Lattner TargetSP target_sp(FindTargetWithProcessID (pid)); 34630fdc8d8SChris Lattner if (target_sp.get()) 34730fdc8d8SChris Lattner { 34830fdc8d8SChris Lattner Process* process = target_sp->GetProcessSP().get(); 34930fdc8d8SChris Lattner if (process) 35030fdc8d8SChris Lattner { 351cfc0935eSJim Ingham process->SendAsyncInterrupt(); 35230fdc8d8SChris Lattner ++num_async_interrupts_sent; 35330fdc8d8SChris Lattner } 35430fdc8d8SChris Lattner } 35530fdc8d8SChris Lattner } 35630fdc8d8SChris Lattner else 35730fdc8d8SChris Lattner { 35830fdc8d8SChris Lattner // We don't have a valid pid to broadcast to, so broadcast to the target 35930fdc8d8SChris Lattner // list's async broadcaster... 36030fdc8d8SChris Lattner BroadcastEvent (Process::eBroadcastBitInterrupt, NULL); 36130fdc8d8SChris Lattner } 36230fdc8d8SChris Lattner 36330fdc8d8SChris Lattner return num_async_interrupts_sent; 36430fdc8d8SChris Lattner } 36530fdc8d8SChris Lattner 36630fdc8d8SChris Lattner uint32_t 36730fdc8d8SChris Lattner TargetList::SignalIfRunning (lldb::pid_t pid, int signo) 36830fdc8d8SChris Lattner { 36930fdc8d8SChris Lattner uint32_t num_signals_sent = 0; 37030fdc8d8SChris Lattner Process *process = NULL; 37130fdc8d8SChris Lattner if (pid == LLDB_INVALID_PROCESS_ID) 37230fdc8d8SChris Lattner { 37330fdc8d8SChris Lattner // Signal all processes with signal 37430fdc8d8SChris Lattner Mutex::Locker locker(m_target_list_mutex); 37530fdc8d8SChris Lattner collection::iterator pos, end = m_target_list.end(); 37630fdc8d8SChris Lattner for (pos = m_target_list.begin(); pos != end; ++pos) 37730fdc8d8SChris Lattner { 37830fdc8d8SChris Lattner process = (*pos)->GetProcessSP().get(); 37930fdc8d8SChris Lattner if (process) 38030fdc8d8SChris Lattner { 38130fdc8d8SChris Lattner if (process->IsAlive()) 38230fdc8d8SChris Lattner { 38330fdc8d8SChris Lattner ++num_signals_sent; 38430fdc8d8SChris Lattner process->Signal (signo); 38530fdc8d8SChris Lattner } 38630fdc8d8SChris Lattner } 38730fdc8d8SChris Lattner } 38830fdc8d8SChris Lattner } 38930fdc8d8SChris Lattner else 39030fdc8d8SChris Lattner { 39130fdc8d8SChris Lattner // Signal a specific process with signal 39230fdc8d8SChris Lattner TargetSP target_sp(FindTargetWithProcessID (pid)); 39330fdc8d8SChris Lattner if (target_sp.get()) 39430fdc8d8SChris Lattner { 39530fdc8d8SChris Lattner process = target_sp->GetProcessSP().get(); 39630fdc8d8SChris Lattner if (process) 39730fdc8d8SChris Lattner { 39830fdc8d8SChris Lattner if (process->IsAlive()) 39930fdc8d8SChris Lattner { 40030fdc8d8SChris Lattner ++num_signals_sent; 40130fdc8d8SChris Lattner process->Signal (signo); 40230fdc8d8SChris Lattner } 40330fdc8d8SChris Lattner } 40430fdc8d8SChris Lattner } 40530fdc8d8SChris Lattner } 40630fdc8d8SChris Lattner return num_signals_sent; 40730fdc8d8SChris Lattner } 40830fdc8d8SChris Lattner 40930fdc8d8SChris Lattner int 41030fdc8d8SChris Lattner TargetList::GetNumTargets () const 41130fdc8d8SChris Lattner { 41230fdc8d8SChris Lattner Mutex::Locker locker (m_target_list_mutex); 41330fdc8d8SChris Lattner return m_target_list.size(); 41430fdc8d8SChris Lattner } 41530fdc8d8SChris Lattner 41630fdc8d8SChris Lattner lldb::TargetSP 41730fdc8d8SChris Lattner TargetList::GetTargetAtIndex (uint32_t idx) const 41830fdc8d8SChris Lattner { 41930fdc8d8SChris Lattner TargetSP target_sp; 42030fdc8d8SChris Lattner Mutex::Locker locker (m_target_list_mutex); 42130fdc8d8SChris Lattner if (idx < m_target_list.size()) 42230fdc8d8SChris Lattner target_sp = m_target_list[idx]; 42330fdc8d8SChris Lattner return target_sp; 42430fdc8d8SChris Lattner } 42530fdc8d8SChris Lattner 42630fdc8d8SChris Lattner uint32_t 4278499e1a4SJim Ingham TargetList::GetIndexOfTarget (lldb::TargetSP target_sp) const 4288499e1a4SJim Ingham { 4298499e1a4SJim Ingham Mutex::Locker locker (m_target_list_mutex); 4308499e1a4SJim Ingham size_t num_targets = m_target_list.size(); 4318499e1a4SJim Ingham for (size_t idx = 0; idx < num_targets; idx++) 4328499e1a4SJim Ingham { 4338499e1a4SJim Ingham if (target_sp == m_target_list[idx]) 4348499e1a4SJim Ingham return idx; 4358499e1a4SJim Ingham } 4368499e1a4SJim Ingham return UINT32_MAX; 4378499e1a4SJim Ingham } 4388499e1a4SJim Ingham 4398499e1a4SJim Ingham uint32_t 4402976d00aSJim Ingham TargetList::SetSelectedTarget (Target* target) 44130fdc8d8SChris Lattner { 44230fdc8d8SChris Lattner Mutex::Locker locker (m_target_list_mutex); 44330fdc8d8SChris Lattner collection::const_iterator pos, 44430fdc8d8SChris Lattner begin = m_target_list.begin(), 44530fdc8d8SChris Lattner end = m_target_list.end(); 44630fdc8d8SChris Lattner for (pos = begin; pos != end; ++pos) 44730fdc8d8SChris Lattner { 44830fdc8d8SChris Lattner if (pos->get() == target) 44930fdc8d8SChris Lattner { 4502976d00aSJim Ingham m_selected_target_idx = std::distance (begin, pos); 4512976d00aSJim Ingham return m_selected_target_idx; 45230fdc8d8SChris Lattner } 45330fdc8d8SChris Lattner } 4542976d00aSJim Ingham m_selected_target_idx = 0; 4552976d00aSJim Ingham return m_selected_target_idx; 45630fdc8d8SChris Lattner } 45730fdc8d8SChris Lattner 45830fdc8d8SChris Lattner lldb::TargetSP 4592976d00aSJim Ingham TargetList::GetSelectedTarget () 46030fdc8d8SChris Lattner { 46130fdc8d8SChris Lattner Mutex::Locker locker (m_target_list_mutex); 4622976d00aSJim Ingham if (m_selected_target_idx >= m_target_list.size()) 4632976d00aSJim Ingham m_selected_target_idx = 0; 4642976d00aSJim Ingham return GetTargetAtIndex (m_selected_target_idx); 46530fdc8d8SChris Lattner } 466