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