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