1 //===-- Process.cpp ---------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Target/Process.h"
11 
12 #include "lldb/lldb-private-log.h"
13 
14 #include "lldb/Breakpoint/StoppointCallbackContext.h"
15 #include "lldb/Breakpoint/BreakpointLocation.h"
16 #include "lldb/Core/Event.h"
17 #include "lldb/Core/ConnectionFileDescriptor.h"
18 #include "lldb/Core/Debugger.h"
19 #include "lldb/Core/InputReader.h"
20 #include "lldb/Core/Log.h"
21 #include "lldb/Core/Module.h"
22 #include "lldb/Core/PluginManager.h"
23 #include "lldb/Core/State.h"
24 #include "lldb/Expression/ClangUserExpression.h"
25 #include "lldb/Interpreter/CommandInterpreter.h"
26 #include "lldb/Host/Host.h"
27 #include "lldb/Target/ABI.h"
28 #include "lldb/Target/DynamicLoader.h"
29 #include "lldb/Target/OperatingSystem.h"
30 #include "lldb/Target/LanguageRuntime.h"
31 #include "lldb/Target/CPPLanguageRuntime.h"
32 #include "lldb/Target/ObjCLanguageRuntime.h"
33 #include "lldb/Target/Platform.h"
34 #include "lldb/Target/RegisterContext.h"
35 #include "lldb/Target/StopInfo.h"
36 #include "lldb/Target/Target.h"
37 #include "lldb/Target/TargetList.h"
38 #include "lldb/Target/Thread.h"
39 #include "lldb/Target/ThreadPlan.h"
40 #include "lldb/Target/ThreadPlanBase.h"
41 
42 using namespace lldb;
43 using namespace lldb_private;
44 
45 
46 // Comment out line below to disable memory caching, overriding the process setting
47 // target.process.disable-memory-cache
48 #define ENABLE_MEMORY_CACHING
49 
50 #ifdef ENABLE_MEMORY_CACHING
51 #define DISABLE_MEM_CACHE_DEFAULT false
52 #else
53 #define DISABLE_MEM_CACHE_DEFAULT true
54 #endif
55 
56 class ProcessOptionValueProperties : public OptionValueProperties
57 {
58 public:
59     ProcessOptionValueProperties (const ConstString &name) :
60         OptionValueProperties (name)
61     {
62     }
63 
64     // This constructor is used when creating ProcessOptionValueProperties when it
65     // is part of a new lldb_private::Process instance. It will copy all current
66     // global property values as needed
67     ProcessOptionValueProperties (ProcessProperties *global_properties) :
68         OptionValueProperties(*global_properties->GetValueProperties())
69     {
70     }
71 
72     virtual const Property *
73     GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const
74     {
75         // When gettings the value for a key from the process options, we will always
76         // try and grab the setting from the current process if there is one. Else we just
77         // use the one from this instance.
78         if (exe_ctx)
79         {
80             Process *process = exe_ctx->GetProcessPtr();
81             if (process)
82             {
83                 ProcessOptionValueProperties *instance_properties = static_cast<ProcessOptionValueProperties *>(process->GetValueProperties().get());
84                 if (this != instance_properties)
85                     return instance_properties->ProtectedGetPropertyAtIndex (idx);
86             }
87         }
88         return ProtectedGetPropertyAtIndex (idx);
89     }
90 };
91 
92 static PropertyDefinition
93 g_properties[] =
94 {
95     { "disable-memory-cache" , OptionValue::eTypeBoolean, false, DISABLE_MEM_CACHE_DEFAULT, NULL, NULL, "Disable reading and caching of memory in fixed-size units." },
96     { "extra-startup-command", OptionValue::eTypeArray  , false, OptionValue::eTypeString, NULL, NULL, "A list containing extra commands understood by the particular process plugin used." },
97     {  NULL                  , OptionValue::eTypeInvalid, false, 0, NULL, NULL, NULL  }
98 };
99 
100 enum {
101     ePropertyDisableMemCache,
102     ePropertyExtraStartCommand
103 };
104 
105 ProcessProperties::ProcessProperties (bool is_global) :
106     Properties ()
107 {
108     if (is_global)
109     {
110         m_collection_sp.reset (new ProcessOptionValueProperties(ConstString("process")));
111         m_collection_sp->Initialize(g_properties);
112         m_collection_sp->AppendProperty(ConstString("thread"),
113                                         ConstString("Settings specify to threads."),
114                                         true,
115                                         Thread::GetGlobalProperties()->GetValueProperties());
116     }
117     else
118         m_collection_sp.reset (new ProcessOptionValueProperties(Process::GetGlobalProperties().get()));
119 }
120 
121 ProcessProperties::~ProcessProperties()
122 {
123 }
124 
125 bool
126 ProcessProperties::GetDisableMemoryCache() const
127 {
128     const uint32_t idx = ePropertyDisableMemCache;
129     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
130 }
131 
132 Args
133 ProcessProperties::GetExtraStartupCommands () const
134 {
135     Args args;
136     const uint32_t idx = ePropertyExtraStartCommand;
137     m_collection_sp->GetPropertyAtIndexAsArgs(NULL, idx, args);
138     return args;
139 }
140 
141 void
142 ProcessProperties::SetExtraStartupCommands (const Args &args)
143 {
144     const uint32_t idx = ePropertyExtraStartCommand;
145     m_collection_sp->SetPropertyAtIndexFromArgs(NULL, idx, args);
146 }
147 
148 void
149 ProcessInstanceInfo::Dump (Stream &s, Platform *platform) const
150 {
151     const char *cstr;
152     if (m_pid != LLDB_INVALID_PROCESS_ID)
153         s.Printf ("    pid = %llu\n", m_pid);
154 
155     if (m_parent_pid != LLDB_INVALID_PROCESS_ID)
156         s.Printf (" parent = %llu\n", m_parent_pid);
157 
158     if (m_executable)
159     {
160         s.Printf ("   name = %s\n", m_executable.GetFilename().GetCString());
161         s.PutCString ("   file = ");
162         m_executable.Dump(&s);
163         s.EOL();
164     }
165     const uint32_t argc = m_arguments.GetArgumentCount();
166     if (argc > 0)
167     {
168         for (uint32_t i=0; i<argc; i++)
169         {
170             const char *arg = m_arguments.GetArgumentAtIndex(i);
171             if (i < 10)
172                 s.Printf (" arg[%u] = %s\n", i, arg);
173             else
174                 s.Printf ("arg[%u] = %s\n", i, arg);
175         }
176     }
177 
178     const uint32_t envc = m_environment.GetArgumentCount();
179     if (envc > 0)
180     {
181         for (uint32_t i=0; i<envc; i++)
182         {
183             const char *env = m_environment.GetArgumentAtIndex(i);
184             if (i < 10)
185                 s.Printf (" env[%u] = %s\n", i, env);
186             else
187                 s.Printf ("env[%u] = %s\n", i, env);
188         }
189     }
190 
191     if (m_arch.IsValid())
192         s.Printf ("   arch = %s\n", m_arch.GetTriple().str().c_str());
193 
194     if (m_uid != UINT32_MAX)
195     {
196         cstr = platform->GetUserName (m_uid);
197         s.Printf ("    uid = %-5u (%s)\n", m_uid, cstr ? cstr : "");
198     }
199     if (m_gid != UINT32_MAX)
200     {
201         cstr = platform->GetGroupName (m_gid);
202         s.Printf ("    gid = %-5u (%s)\n", m_gid, cstr ? cstr : "");
203     }
204     if (m_euid != UINT32_MAX)
205     {
206         cstr = platform->GetUserName (m_euid);
207         s.Printf ("   euid = %-5u (%s)\n", m_euid, cstr ? cstr : "");
208     }
209     if (m_egid != UINT32_MAX)
210     {
211         cstr = platform->GetGroupName (m_egid);
212         s.Printf ("   egid = %-5u (%s)\n", m_egid, cstr ? cstr : "");
213     }
214 }
215 
216 void
217 ProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose)
218 {
219     const char *label;
220     if (show_args || verbose)
221         label = "ARGUMENTS";
222     else
223         label = "NAME";
224 
225     if (verbose)
226     {
227         s.Printf     ("PID    PARENT USER       GROUP      EFF USER   EFF GROUP  TRIPLE                   %s\n", label);
228         s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n");
229     }
230     else
231     {
232         s.Printf     ("PID    PARENT USER       ARCH    %s\n", label);
233         s.PutCString ("====== ====== ========== ======= ============================\n");
234     }
235 }
236 
237 void
238 ProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const
239 {
240     if (m_pid != LLDB_INVALID_PROCESS_ID)
241     {
242         const char *cstr;
243         s.Printf ("%-6llu %-6llu ", m_pid, m_parent_pid);
244 
245 
246         if (verbose)
247         {
248             cstr = platform->GetUserName (m_uid);
249             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
250                 s.Printf ("%-10s ", cstr);
251             else
252                 s.Printf ("%-10u ", m_uid);
253 
254             cstr = platform->GetGroupName (m_gid);
255             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
256                 s.Printf ("%-10s ", cstr);
257             else
258                 s.Printf ("%-10u ", m_gid);
259 
260             cstr = platform->GetUserName (m_euid);
261             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
262                 s.Printf ("%-10s ", cstr);
263             else
264                 s.Printf ("%-10u ", m_euid);
265 
266             cstr = platform->GetGroupName (m_egid);
267             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
268                 s.Printf ("%-10s ", cstr);
269             else
270                 s.Printf ("%-10u ", m_egid);
271             s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : "");
272         }
273         else
274         {
275             s.Printf ("%-10s %-7d %s ",
276                       platform->GetUserName (m_euid),
277                       (int)m_arch.GetTriple().getArchName().size(),
278                       m_arch.GetTriple().getArchName().data());
279         }
280 
281         if (verbose || show_args)
282         {
283             const uint32_t argc = m_arguments.GetArgumentCount();
284             if (argc > 0)
285             {
286                 for (uint32_t i=0; i<argc; i++)
287                 {
288                     if (i > 0)
289                         s.PutChar (' ');
290                     s.PutCString (m_arguments.GetArgumentAtIndex(i));
291                 }
292             }
293         }
294         else
295         {
296             s.PutCString (GetName());
297         }
298 
299         s.EOL();
300     }
301 }
302 
303 
304 void
305 ProcessInfo::SetArguments (char const **argv,
306                            bool first_arg_is_executable,
307                            bool first_arg_is_executable_and_argument)
308 {
309     m_arguments.SetArguments (argv);
310 
311     // Is the first argument the executable?
312     if (first_arg_is_executable)
313     {
314         const char *first_arg = m_arguments.GetArgumentAtIndex (0);
315         if (first_arg)
316         {
317             // Yes the first argument is an executable, set it as the executable
318             // in the launch options. Don't resolve the file path as the path
319             // could be a remote platform path
320             const bool resolve = false;
321             m_executable.SetFile(first_arg, resolve);
322 
323             // If argument zero is an executable and shouldn't be included
324             // in the arguments, remove it from the front of the arguments
325             if (first_arg_is_executable_and_argument == false)
326                 m_arguments.DeleteArgumentAtIndex (0);
327         }
328     }
329 }
330 void
331 ProcessInfo::SetArguments (const Args& args,
332                            bool first_arg_is_executable,
333                            bool first_arg_is_executable_and_argument)
334 {
335     // Copy all arguments
336     m_arguments = args;
337 
338     // Is the first argument the executable?
339     if (first_arg_is_executable)
340     {
341         const char *first_arg = m_arguments.GetArgumentAtIndex (0);
342         if (first_arg)
343         {
344             // Yes the first argument is an executable, set it as the executable
345             // in the launch options. Don't resolve the file path as the path
346             // could be a remote platform path
347             const bool resolve = false;
348             m_executable.SetFile(first_arg, resolve);
349 
350             // If argument zero is an executable and shouldn't be included
351             // in the arguments, remove it from the front of the arguments
352             if (first_arg_is_executable_and_argument == false)
353                 m_arguments.DeleteArgumentAtIndex (0);
354         }
355     }
356 }
357 
358 void
359 ProcessLaunchInfo::FinalizeFileActions (Target *target, bool default_to_use_pty)
360 {
361     // If notthing was specified, then check the process for any default
362     // settings that were set with "settings set"
363     if (m_file_actions.empty())
364     {
365         if (m_flags.Test(eLaunchFlagDisableSTDIO))
366         {
367             AppendSuppressFileAction (STDIN_FILENO , true, false);
368             AppendSuppressFileAction (STDOUT_FILENO, false, true);
369             AppendSuppressFileAction (STDERR_FILENO, false, true);
370         }
371         else
372         {
373             // Check for any values that might have gotten set with any of:
374             // (lldb) settings set target.input-path
375             // (lldb) settings set target.output-path
376             // (lldb) settings set target.error-path
377             FileSpec in_path;
378             FileSpec out_path;
379             FileSpec err_path;
380             if (target)
381             {
382                 in_path = target->GetStandardInputPath();
383                 out_path = target->GetStandardOutputPath();
384                 err_path = target->GetStandardErrorPath();
385             }
386 
387             if (in_path || out_path || err_path)
388             {
389                 char path[PATH_MAX];
390                 if (in_path && in_path.GetPath(path, sizeof(path)))
391                     AppendOpenFileAction(STDIN_FILENO, path, true, false);
392 
393                 if (out_path && out_path.GetPath(path, sizeof(path)))
394                     AppendOpenFileAction(STDOUT_FILENO, path, false, true);
395 
396                 if (err_path && err_path.GetPath(path, sizeof(path)))
397                     AppendOpenFileAction(STDERR_FILENO, path, false, true);
398             }
399             else if (default_to_use_pty)
400             {
401                 if (m_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, NULL, 0))
402                 {
403                     const char *slave_path = m_pty.GetSlaveName (NULL, 0);
404                     AppendOpenFileAction(STDIN_FILENO, slave_path, true, false);
405                     AppendOpenFileAction(STDOUT_FILENO, slave_path, false, true);
406                     AppendOpenFileAction(STDERR_FILENO, slave_path, false, true);
407                 }
408             }
409         }
410     }
411 }
412 
413 
414 bool
415 ProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error,
416                                                         bool localhost,
417                                                         bool will_debug,
418                                                         bool first_arg_is_full_shell_command)
419 {
420     error.Clear();
421 
422     if (GetFlags().Test (eLaunchFlagLaunchInShell))
423     {
424         const char *shell_executable = GetShell();
425         if (shell_executable)
426         {
427             char shell_resolved_path[PATH_MAX];
428 
429             if (localhost)
430             {
431                 FileSpec shell_filespec (shell_executable, true);
432 
433                 if (!shell_filespec.Exists())
434                 {
435                     // Resolve the path in case we just got "bash", "sh" or "tcsh"
436                     if (!shell_filespec.ResolveExecutableLocation ())
437                     {
438                         error.SetErrorStringWithFormat("invalid shell path '%s'", shell_executable);
439                         return false;
440                     }
441                 }
442                 shell_filespec.GetPath (shell_resolved_path, sizeof(shell_resolved_path));
443                 shell_executable = shell_resolved_path;
444             }
445 
446             Args shell_arguments;
447             std::string safe_arg;
448             shell_arguments.AppendArgument (shell_executable);
449             shell_arguments.AppendArgument ("-c");
450 
451             StreamString shell_command;
452             if (will_debug)
453             {
454                 shell_command.PutCString ("exec");
455                 if (GetArchitecture().IsValid())
456                 {
457                     shell_command.Printf(" /usr/bin/arch -arch %s", GetArchitecture().GetArchitectureName());
458                     // Set the resume count to 2:
459                     // 1 - stop in shell
460                     // 2 - stop in /usr/bin/arch
461                     // 3 - then we will stop in our program
462                     SetResumeCount(2);
463                 }
464                 else
465                 {
466                     // Set the resume count to 1:
467                     // 1 - stop in shell
468                     // 2 - then we will stop in our program
469                     SetResumeCount(1);
470                 }
471             }
472 
473             const char **argv = GetArguments().GetConstArgumentVector ();
474             if (argv)
475             {
476                 if (first_arg_is_full_shell_command)
477                 {
478                     // There should only be one argument that is the shell command itself to be used as is
479                     if (argv[0] && !argv[1])
480                         shell_command.Printf("%s", argv[0]);
481                     else
482                         return false;
483                 }
484                 else
485                 {
486                     for (size_t i=0; argv[i] != NULL; ++i)
487                     {
488                         const char *arg = Args::GetShellSafeArgument (argv[i], safe_arg);
489                         shell_command.Printf(" %s", arg);
490                     }
491                 }
492                 shell_arguments.AppendArgument (shell_command.GetString().c_str());
493             }
494             else
495             {
496                 return false;
497             }
498 
499             m_executable.SetFile(shell_executable, false);
500             m_arguments = shell_arguments;
501             return true;
502         }
503         else
504         {
505             error.SetErrorString ("invalid shell path");
506         }
507     }
508     else
509     {
510         error.SetErrorString ("not launching in shell");
511     }
512     return false;
513 }
514 
515 
516 bool
517 ProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write)
518 {
519     if ((read || write) && fd >= 0 && path && path[0])
520     {
521         m_action = eFileActionOpen;
522         m_fd = fd;
523         if (read && write)
524             m_arg = O_NOCTTY | O_CREAT | O_RDWR;
525         else if (read)
526             m_arg = O_NOCTTY | O_RDONLY;
527         else
528             m_arg = O_NOCTTY | O_CREAT | O_WRONLY;
529         m_path.assign (path);
530         return true;
531     }
532     else
533     {
534         Clear();
535     }
536     return false;
537 }
538 
539 bool
540 ProcessLaunchInfo::FileAction::Close (int fd)
541 {
542     Clear();
543     if (fd >= 0)
544     {
545         m_action = eFileActionClose;
546         m_fd = fd;
547     }
548     return m_fd >= 0;
549 }
550 
551 
552 bool
553 ProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd)
554 {
555     Clear();
556     if (fd >= 0 && dup_fd >= 0)
557     {
558         m_action = eFileActionDuplicate;
559         m_fd = fd;
560         m_arg = dup_fd;
561     }
562     return m_fd >= 0;
563 }
564 
565 
566 
567 bool
568 ProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (posix_spawn_file_actions_t *file_actions,
569                                                         const FileAction *info,
570                                                         Log *log,
571                                                         Error& error)
572 {
573     if (info == NULL)
574         return false;
575 
576     switch (info->m_action)
577     {
578         case eFileActionNone:
579             error.Clear();
580             break;
581 
582         case eFileActionClose:
583             if (info->m_fd == -1)
584                 error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)");
585             else
586             {
587                 error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd),
588                                 eErrorTypePOSIX);
589                 if (log && (error.Fail() || log))
590                     error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)",
591                                    file_actions, info->m_fd);
592             }
593             break;
594 
595         case eFileActionDuplicate:
596             if (info->m_fd == -1)
597                 error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)");
598             else if (info->m_arg == -1)
599                 error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)");
600             else
601             {
602                 error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg),
603                                 eErrorTypePOSIX);
604                 if (log && (error.Fail() || log))
605                     error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)",
606                                    file_actions, info->m_fd, info->m_arg);
607             }
608             break;
609 
610         case eFileActionOpen:
611             if (info->m_fd == -1)
612                 error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)");
613             else
614             {
615                 int oflag = info->m_arg;
616 
617                 mode_t mode = 0;
618 
619                 if (oflag & O_CREAT)
620                     mode = 0640;
621 
622                 error.SetError (::posix_spawn_file_actions_addopen (file_actions,
623                                                                     info->m_fd,
624                                                                     info->m_path.c_str(),
625                                                                     oflag,
626                                                                     mode),
627                                 eErrorTypePOSIX);
628                 if (error.Fail() || log)
629                     error.PutToLog(log,
630                                    "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)",
631                                    file_actions, info->m_fd, info->m_path.c_str(), oflag, mode);
632             }
633             break;
634 
635         default:
636             error.SetErrorStringWithFormat ("invalid file action: %i", info->m_action);
637             break;
638     }
639     return error.Success();
640 }
641 
642 Error
643 ProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
644 {
645     Error error;
646     char short_option = (char) m_getopt_table[option_idx].val;
647 
648     switch (short_option)
649     {
650         case 's':   // Stop at program entry point
651             launch_info.GetFlags().Set (eLaunchFlagStopAtEntry);
652             break;
653 
654         case 'i':   // STDIN for read only
655             {
656                 ProcessLaunchInfo::FileAction action;
657                 if (action.Open (STDIN_FILENO, option_arg, true, false))
658                     launch_info.AppendFileAction (action);
659             }
660             break;
661 
662         case 'o':   // Open STDOUT for write only
663             {
664                 ProcessLaunchInfo::FileAction action;
665                 if (action.Open (STDOUT_FILENO, option_arg, false, true))
666                     launch_info.AppendFileAction (action);
667             }
668             break;
669 
670         case 'e':   // STDERR for write only
671             {
672                 ProcessLaunchInfo::FileAction action;
673                 if (action.Open (STDERR_FILENO, option_arg, false, true))
674                     launch_info.AppendFileAction (action);
675             }
676             break;
677 
678 
679         case 'p':   // Process plug-in name
680             launch_info.SetProcessPluginName (option_arg);
681             break;
682 
683         case 'n':   // Disable STDIO
684             {
685                 ProcessLaunchInfo::FileAction action;
686                 if (action.Open (STDIN_FILENO, "/dev/null", true, false))
687                     launch_info.AppendFileAction (action);
688                 if (action.Open (STDOUT_FILENO, "/dev/null", false, true))
689                     launch_info.AppendFileAction (action);
690                 if (action.Open (STDERR_FILENO, "/dev/null", false, true))
691                     launch_info.AppendFileAction (action);
692             }
693             break;
694 
695         case 'w':
696             launch_info.SetWorkingDirectory (option_arg);
697             break;
698 
699         case 't':   // Open process in new terminal window
700             launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY);
701             break;
702 
703         case 'a':
704             if (!launch_info.GetArchitecture().SetTriple (option_arg, m_interpreter.GetPlatform(true).get()))
705                 launch_info.GetArchitecture().SetTriple (option_arg);
706             break;
707 
708         case 'A':
709             launch_info.GetFlags().Set (eLaunchFlagDisableASLR);
710             break;
711 
712         case 'c':
713             if (option_arg && option_arg[0])
714                 launch_info.SetShell (option_arg);
715             else
716                 launch_info.SetShell ("/bin/bash");
717             break;
718 
719         case 'v':
720             launch_info.GetEnvironmentEntries().AppendArgument(option_arg);
721             break;
722 
723         default:
724             error.SetErrorStringWithFormat("unrecognized short option character '%c'", short_option);
725             break;
726 
727     }
728     return error;
729 }
730 
731 OptionDefinition
732 ProcessLaunchCommandOptions::g_option_table[] =
733 {
734 { LLDB_OPT_SET_ALL, false, "stop-at-entry", 's', no_argument,       NULL, 0, eArgTypeNone,          "Stop at the entry point of the program when launching a process."},
735 { LLDB_OPT_SET_ALL, false, "disable-aslr",  'A', no_argument,       NULL, 0, eArgTypeNone,          "Disable address space layout randomization when launching a process."},
736 { LLDB_OPT_SET_ALL, false, "plugin",        'p', required_argument, NULL, 0, eArgTypePlugin,        "Name of the process plugin you want to use."},
737 { LLDB_OPT_SET_ALL, false, "working-dir",   'w', required_argument, NULL, 0, eArgTypePath,          "Set the current working directory to <path> when running the inferior."},
738 { LLDB_OPT_SET_ALL, false, "arch",          'a', required_argument, NULL, 0, eArgTypeArchitecture,  "Set the architecture for the process to launch when ambiguous."},
739 { LLDB_OPT_SET_ALL, false, "environment",   'v', required_argument, NULL, 0, eArgTypeNone,          "Specify an environment variable name/value stirng (--environement NAME=VALUE). Can be specified multiple times for subsequent environment entries."},
740 { LLDB_OPT_SET_ALL, false, "shell",         'c', optional_argument, NULL, 0, eArgTypePath,          "Run the process in a shell (not supported on all platforms)."},
741 
742 { LLDB_OPT_SET_1  , false, "stdin",         'i', required_argument, NULL, 0, eArgTypePath,    "Redirect stdin for the process to <path>."},
743 { LLDB_OPT_SET_1  , false, "stdout",        'o', required_argument, NULL, 0, eArgTypePath,    "Redirect stdout for the process to <path>."},
744 { LLDB_OPT_SET_1  , false, "stderr",        'e', required_argument, NULL, 0, eArgTypePath,    "Redirect stderr for the process to <path>."},
745 
746 { LLDB_OPT_SET_2  , false, "tty",           't', no_argument,       NULL, 0, eArgTypeNone,    "Start the process in a terminal (not supported on all platforms)."},
747 
748 { LLDB_OPT_SET_3  , false, "no-stdio",      'n', no_argument,       NULL, 0, eArgTypeNone,    "Do not set up for terminal I/O to go to running process."},
749 
750 { 0               , false, NULL,             0,  0,                 NULL, 0, eArgTypeNone,    NULL }
751 };
752 
753 
754 
755 bool
756 ProcessInstanceInfoMatch::NameMatches (const char *process_name) const
757 {
758     if (m_name_match_type == eNameMatchIgnore || process_name == NULL)
759         return true;
760     const char *match_name = m_match_info.GetName();
761     if (!match_name)
762         return true;
763 
764     return lldb_private::NameMatches (process_name, m_name_match_type, match_name);
765 }
766 
767 bool
768 ProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const
769 {
770     if (!NameMatches (proc_info.GetName()))
771         return false;
772 
773     if (m_match_info.ProcessIDIsValid() &&
774         m_match_info.GetProcessID() != proc_info.GetProcessID())
775         return false;
776 
777     if (m_match_info.ParentProcessIDIsValid() &&
778         m_match_info.GetParentProcessID() != proc_info.GetParentProcessID())
779         return false;
780 
781     if (m_match_info.UserIDIsValid () &&
782         m_match_info.GetUserID() != proc_info.GetUserID())
783         return false;
784 
785     if (m_match_info.GroupIDIsValid () &&
786         m_match_info.GetGroupID() != proc_info.GetGroupID())
787         return false;
788 
789     if (m_match_info.EffectiveUserIDIsValid () &&
790         m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID())
791         return false;
792 
793     if (m_match_info.EffectiveGroupIDIsValid () &&
794         m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID())
795         return false;
796 
797     if (m_match_info.GetArchitecture().IsValid() &&
798         m_match_info.GetArchitecture() != proc_info.GetArchitecture())
799         return false;
800     return true;
801 }
802 
803 bool
804 ProcessInstanceInfoMatch::MatchAllProcesses () const
805 {
806     if (m_name_match_type != eNameMatchIgnore)
807         return false;
808 
809     if (m_match_info.ProcessIDIsValid())
810         return false;
811 
812     if (m_match_info.ParentProcessIDIsValid())
813         return false;
814 
815     if (m_match_info.UserIDIsValid ())
816         return false;
817 
818     if (m_match_info.GroupIDIsValid ())
819         return false;
820 
821     if (m_match_info.EffectiveUserIDIsValid ())
822         return false;
823 
824     if (m_match_info.EffectiveGroupIDIsValid ())
825         return false;
826 
827     if (m_match_info.GetArchitecture().IsValid())
828         return false;
829 
830     if (m_match_all_users)
831         return false;
832 
833     return true;
834 
835 }
836 
837 void
838 ProcessInstanceInfoMatch::Clear()
839 {
840     m_match_info.Clear();
841     m_name_match_type = eNameMatchIgnore;
842     m_match_all_users = false;
843 }
844 
845 ProcessSP
846 Process::FindPlugin (Target &target, const char *plugin_name, Listener &listener, const FileSpec *crash_file_path)
847 {
848     ProcessSP process_sp;
849     ProcessCreateInstance create_callback = NULL;
850     if (plugin_name)
851     {
852         create_callback  = PluginManager::GetProcessCreateCallbackForPluginName (plugin_name);
853         if (create_callback)
854         {
855             process_sp = create_callback(target, listener, crash_file_path);
856             if (process_sp)
857             {
858                 if (!process_sp->CanDebug(target, true))
859                     process_sp.reset();
860             }
861         }
862     }
863     else
864     {
865         for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx)
866         {
867             process_sp = create_callback(target, listener, crash_file_path);
868             if (process_sp)
869             {
870                 if (!process_sp->CanDebug(target, false))
871                     process_sp.reset();
872                 else
873                     break;
874             }
875         }
876     }
877     return process_sp;
878 }
879 
880 ConstString &
881 Process::GetStaticBroadcasterClass ()
882 {
883     static ConstString class_name ("lldb.process");
884     return class_name;
885 }
886 
887 //----------------------------------------------------------------------
888 // Process constructor
889 //----------------------------------------------------------------------
890 Process::Process(Target &target, Listener &listener) :
891     ProcessProperties (false),
892     UserID (LLDB_INVALID_PROCESS_ID),
893     Broadcaster (&(target.GetDebugger()), "lldb.process"),
894     m_target (target),
895     m_public_state (eStateUnloaded),
896     m_private_state (eStateUnloaded),
897     m_private_state_broadcaster (NULL, "lldb.process.internal_state_broadcaster"),
898     m_private_state_control_broadcaster (NULL, "lldb.process.internal_state_control_broadcaster"),
899     m_private_state_listener ("lldb.process.internal_state_listener"),
900     m_private_state_control_wait(),
901     m_private_state_thread (LLDB_INVALID_HOST_THREAD),
902     m_mod_id (),
903     m_thread_index_id (0),
904     m_exit_status (-1),
905     m_exit_string (),
906     m_thread_list (this),
907     m_notifications (),
908     m_image_tokens (),
909     m_listener (listener),
910     m_breakpoint_site_list (),
911     m_dynamic_checkers_ap (),
912     m_unix_signals (),
913     m_abi_sp (),
914     m_process_input_reader (),
915     m_stdio_communication ("process.stdio"),
916     m_stdio_communication_mutex (Mutex::eMutexTypeRecursive),
917     m_stdout_data (),
918     m_stderr_data (),
919     m_memory_cache (*this),
920     m_allocated_memory_cache (*this),
921     m_should_detach (false),
922     m_next_event_action_ap(),
923     m_run_lock (),
924     m_currently_handling_event(false),
925     m_finalize_called(false),
926     m_can_jit(eCanJITDontKnow)
927 {
928     CheckInWithManager ();
929 
930     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
931     if (log)
932         log->Printf ("%p Process::Process()", this);
933 
934     SetEventName (eBroadcastBitStateChanged, "state-changed");
935     SetEventName (eBroadcastBitInterrupt, "interrupt");
936     SetEventName (eBroadcastBitSTDOUT, "stdout-available");
937     SetEventName (eBroadcastBitSTDERR, "stderr-available");
938 
939     listener.StartListeningForEvents (this,
940                                       eBroadcastBitStateChanged |
941                                       eBroadcastBitInterrupt |
942                                       eBroadcastBitSTDOUT |
943                                       eBroadcastBitSTDERR);
944 
945     m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster,
946                                                      eBroadcastBitStateChanged |
947                                                      eBroadcastBitInterrupt);
948 
949     m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster,
950                                                      eBroadcastInternalStateControlStop |
951                                                      eBroadcastInternalStateControlPause |
952                                                      eBroadcastInternalStateControlResume);
953 }
954 
955 //----------------------------------------------------------------------
956 // Destructor
957 //----------------------------------------------------------------------
958 Process::~Process()
959 {
960     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
961     if (log)
962         log->Printf ("%p Process::~Process()", this);
963     StopPrivateStateThread();
964 }
965 
966 const ProcessPropertiesSP &
967 Process::GetGlobalProperties()
968 {
969     static ProcessPropertiesSP g_settings_sp;
970     if (!g_settings_sp)
971         g_settings_sp.reset (new ProcessProperties (true));
972     return g_settings_sp;
973 }
974 
975 void
976 Process::Finalize()
977 {
978     switch (GetPrivateState())
979     {
980         case eStateConnected:
981         case eStateAttaching:
982         case eStateLaunching:
983         case eStateStopped:
984         case eStateRunning:
985         case eStateStepping:
986         case eStateCrashed:
987         case eStateSuspended:
988             if (GetShouldDetach())
989                 Detach();
990             else
991                 Destroy();
992             break;
993 
994         case eStateInvalid:
995         case eStateUnloaded:
996         case eStateDetached:
997         case eStateExited:
998             break;
999     }
1000 
1001     // Clear our broadcaster before we proceed with destroying
1002     Broadcaster::Clear();
1003 
1004     // Do any cleanup needed prior to being destructed... Subclasses
1005     // that override this method should call this superclass method as well.
1006 
1007     // We need to destroy the loader before the derived Process class gets destroyed
1008     // since it is very likely that undoing the loader will require access to the real process.
1009     m_dynamic_checkers_ap.reset();
1010     m_abi_sp.reset();
1011     m_os_ap.reset();
1012     m_dyld_ap.reset();
1013     m_thread_list.Destroy();
1014     std::vector<Notifications> empty_notifications;
1015     m_notifications.swap(empty_notifications);
1016     m_image_tokens.clear();
1017     m_memory_cache.Clear();
1018     m_allocated_memory_cache.Clear();
1019     m_language_runtimes.clear();
1020     m_next_event_action_ap.reset();
1021     m_finalize_called = true;
1022 }
1023 
1024 void
1025 Process::RegisterNotificationCallbacks (const Notifications& callbacks)
1026 {
1027     m_notifications.push_back(callbacks);
1028     if (callbacks.initialize != NULL)
1029         callbacks.initialize (callbacks.baton, this);
1030 }
1031 
1032 bool
1033 Process::UnregisterNotificationCallbacks(const Notifications& callbacks)
1034 {
1035     std::vector<Notifications>::iterator pos, end = m_notifications.end();
1036     for (pos = m_notifications.begin(); pos != end; ++pos)
1037     {
1038         if (pos->baton == callbacks.baton &&
1039             pos->initialize == callbacks.initialize &&
1040             pos->process_state_changed == callbacks.process_state_changed)
1041         {
1042             m_notifications.erase(pos);
1043             return true;
1044         }
1045     }
1046     return false;
1047 }
1048 
1049 void
1050 Process::SynchronouslyNotifyStateChanged (StateType state)
1051 {
1052     std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end();
1053     for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos)
1054     {
1055         if (notification_pos->process_state_changed)
1056             notification_pos->process_state_changed (notification_pos->baton, this, state);
1057     }
1058 }
1059 
1060 // FIXME: We need to do some work on events before the general Listener sees them.
1061 // For instance if we are continuing from a breakpoint, we need to ensure that we do
1062 // the little "insert real insn, step & stop" trick.  But we can't do that when the
1063 // event is delivered by the broadcaster - since that is done on the thread that is
1064 // waiting for new events, so if we needed more than one event for our handling, we would
1065 // stall.  So instead we do it when we fetch the event off of the queue.
1066 //
1067 
1068 StateType
1069 Process::GetNextEvent (EventSP &event_sp)
1070 {
1071     StateType state = eStateInvalid;
1072 
1073     if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp)
1074         state = Process::ProcessEventData::GetStateFromEvent (event_sp.get());
1075 
1076     return state;
1077 }
1078 
1079 
1080 StateType
1081 Process::WaitForProcessToStop (const TimeValue *timeout)
1082 {
1083     // We can't just wait for a "stopped" event, because the stopped event may have restarted the target.
1084     // We have to actually check each event, and in the case of a stopped event check the restarted flag
1085     // on the event.
1086     EventSP event_sp;
1087     StateType state = GetState();
1088     // If we are exited or detached, we won't ever get back to any
1089     // other valid state...
1090     if (state == eStateDetached || state == eStateExited)
1091         return state;
1092 
1093     while (state != eStateInvalid)
1094     {
1095         state = WaitForStateChangedEvents (timeout, event_sp);
1096         switch (state)
1097         {
1098         case eStateCrashed:
1099         case eStateDetached:
1100         case eStateExited:
1101         case eStateUnloaded:
1102             return state;
1103         case eStateStopped:
1104             if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
1105                 continue;
1106             else
1107                 return state;
1108         default:
1109             continue;
1110         }
1111     }
1112     return state;
1113 }
1114 
1115 
1116 StateType
1117 Process::WaitForState
1118 (
1119     const TimeValue *timeout,
1120     const StateType *match_states, const uint32_t num_match_states
1121 )
1122 {
1123     EventSP event_sp;
1124     uint32_t i;
1125     StateType state = GetState();
1126     while (state != eStateInvalid)
1127     {
1128         // If we are exited or detached, we won't ever get back to any
1129         // other valid state...
1130         if (state == eStateDetached || state == eStateExited)
1131             return state;
1132 
1133         state = WaitForStateChangedEvents (timeout, event_sp);
1134 
1135         for (i=0; i<num_match_states; ++i)
1136         {
1137             if (match_states[i] == state)
1138                 return state;
1139         }
1140     }
1141     return state;
1142 }
1143 
1144 bool
1145 Process::HijackProcessEvents (Listener *listener)
1146 {
1147     if (listener != NULL)
1148     {
1149         return HijackBroadcaster(listener, eBroadcastBitStateChanged | eBroadcastBitInterrupt);
1150     }
1151     else
1152         return false;
1153 }
1154 
1155 void
1156 Process::RestoreProcessEvents ()
1157 {
1158     RestoreBroadcaster();
1159 }
1160 
1161 bool
1162 Process::HijackPrivateProcessEvents (Listener *listener)
1163 {
1164     if (listener != NULL)
1165     {
1166         return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged | eBroadcastBitInterrupt);
1167     }
1168     else
1169         return false;
1170 }
1171 
1172 void
1173 Process::RestorePrivateProcessEvents ()
1174 {
1175     m_private_state_broadcaster.RestoreBroadcaster();
1176 }
1177 
1178 StateType
1179 Process::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp)
1180 {
1181     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1182 
1183     if (log)
1184         log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
1185 
1186     StateType state = eStateInvalid;
1187     if (m_listener.WaitForEventForBroadcasterWithType (timeout,
1188                                                        this,
1189                                                        eBroadcastBitStateChanged | eBroadcastBitInterrupt,
1190                                                        event_sp))
1191     {
1192         if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged)
1193             state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
1194         else if (log)
1195             log->Printf ("Process::%s got no event or was interrupted.", __FUNCTION__);
1196     }
1197 
1198     if (log)
1199         log->Printf ("Process::%s (timeout = %p, event_sp) => %s",
1200                      __FUNCTION__,
1201                      timeout,
1202                      StateAsCString(state));
1203     return state;
1204 }
1205 
1206 Event *
1207 Process::PeekAtStateChangedEvents ()
1208 {
1209     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1210 
1211     if (log)
1212         log->Printf ("Process::%s...", __FUNCTION__);
1213 
1214     Event *event_ptr;
1215     event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this,
1216                                                                   eBroadcastBitStateChanged);
1217     if (log)
1218     {
1219         if (event_ptr)
1220         {
1221             log->Printf ("Process::%s (event_ptr) => %s",
1222                          __FUNCTION__,
1223                          StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr)));
1224         }
1225         else
1226         {
1227             log->Printf ("Process::%s no events found",
1228                          __FUNCTION__);
1229         }
1230     }
1231     return event_ptr;
1232 }
1233 
1234 StateType
1235 Process::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp)
1236 {
1237     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1238 
1239     if (log)
1240         log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
1241 
1242     StateType state = eStateInvalid;
1243     if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout,
1244                                                                      &m_private_state_broadcaster,
1245                                                                      eBroadcastBitStateChanged | eBroadcastBitInterrupt,
1246                                                                      event_sp))
1247         if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged)
1248             state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
1249 
1250     // This is a bit of a hack, but when we wait here we could very well return
1251     // to the command-line, and that could disable the log, which would render the
1252     // log we got above invalid.
1253     if (log)
1254     {
1255         if (state == eStateInvalid)
1256             log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout);
1257         else
1258             log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state));
1259     }
1260     return state;
1261 }
1262 
1263 bool
1264 Process::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only)
1265 {
1266     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1267 
1268     if (log)
1269         log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
1270 
1271     if (control_only)
1272         return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp);
1273     else
1274         return m_private_state_listener.WaitForEvent(timeout, event_sp);
1275 }
1276 
1277 bool
1278 Process::IsRunning () const
1279 {
1280     return StateIsRunningState (m_public_state.GetValue());
1281 }
1282 
1283 int
1284 Process::GetExitStatus ()
1285 {
1286     if (m_public_state.GetValue() == eStateExited)
1287         return m_exit_status;
1288     return -1;
1289 }
1290 
1291 
1292 const char *
1293 Process::GetExitDescription ()
1294 {
1295     if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty())
1296         return m_exit_string.c_str();
1297     return NULL;
1298 }
1299 
1300 bool
1301 Process::SetExitStatus (int status, const char *cstr)
1302 {
1303     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1304     if (log)
1305         log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)",
1306                     status, status,
1307                     cstr ? "\"" : "",
1308                     cstr ? cstr : "NULL",
1309                     cstr ? "\"" : "");
1310 
1311     // We were already in the exited state
1312     if (m_private_state.GetValue() == eStateExited)
1313     {
1314         if (log)
1315             log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited");
1316         return false;
1317     }
1318 
1319     m_exit_status = status;
1320     if (cstr)
1321         m_exit_string = cstr;
1322     else
1323         m_exit_string.clear();
1324 
1325     DidExit ();
1326 
1327     SetPrivateState (eStateExited);
1328     return true;
1329 }
1330 
1331 // This static callback can be used to watch for local child processes on
1332 // the current host. The the child process exits, the process will be
1333 // found in the global target list (we want to be completely sure that the
1334 // lldb_private::Process doesn't go away before we can deliver the signal.
1335 bool
1336 Process::SetProcessExitStatus (void *callback_baton,
1337                                lldb::pid_t pid,
1338                                bool exited,
1339                                int signo,          // Zero for no signal
1340                                int exit_status     // Exit value of process if signal is zero
1341 )
1342 {
1343     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS));
1344     if (log)
1345         log->Printf ("Process::SetProcessExitStatus (baton=%p, pid=%llu, exited=%i, signal=%i, exit_status=%i)\n",
1346                      callback_baton,
1347                      pid,
1348                      exited,
1349                      signo,
1350                      exit_status);
1351 
1352     if (exited)
1353     {
1354         TargetSP target_sp(Debugger::FindTargetWithProcessID (pid));
1355         if (target_sp)
1356         {
1357             ProcessSP process_sp (target_sp->GetProcessSP());
1358             if (process_sp)
1359             {
1360                 const char *signal_cstr = NULL;
1361                 if (signo)
1362                     signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo);
1363 
1364                 process_sp->SetExitStatus (exit_status, signal_cstr);
1365             }
1366         }
1367         return true;
1368     }
1369     return false;
1370 }
1371 
1372 
1373 void
1374 Process::UpdateThreadListIfNeeded ()
1375 {
1376     const uint32_t stop_id = GetStopID();
1377     if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID())
1378     {
1379         const StateType state = GetPrivateState();
1380         if (StateIsStoppedState (state, true))
1381         {
1382             Mutex::Locker locker (m_thread_list.GetMutex ());
1383             // m_thread_list does have its own mutex, but we need to
1384             // hold onto the mutex between the call to UpdateThreadList(...)
1385             // and the os->UpdateThreadList(...) so it doesn't change on us
1386             ThreadList new_thread_list(this);
1387             // Always update the thread list with the protocol specific
1388             // thread list, but only update if "true" is returned
1389             if (UpdateThreadList (m_thread_list, new_thread_list))
1390             {
1391                 OperatingSystem *os = GetOperatingSystem ();
1392                 if (os)
1393                     os->UpdateThreadList (m_thread_list, new_thread_list);
1394                 m_thread_list.Update (new_thread_list);
1395                 m_thread_list.SetStopID (stop_id);
1396             }
1397         }
1398     }
1399 }
1400 
1401 uint32_t
1402 Process::GetNextThreadIndexID ()
1403 {
1404     return ++m_thread_index_id;
1405 }
1406 
1407 StateType
1408 Process::GetState()
1409 {
1410     // If any other threads access this we will need a mutex for it
1411     return m_public_state.GetValue ();
1412 }
1413 
1414 void
1415 Process::SetPublicState (StateType new_state)
1416 {
1417     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1418     if (log)
1419         log->Printf("Process::SetPublicState (%s)", StateAsCString(new_state));
1420     const StateType old_state = m_public_state.GetValue();
1421     m_public_state.SetValue (new_state);
1422 
1423     // On the transition from Run to Stopped, we unlock the writer end of the
1424     // run lock.  The lock gets locked in Resume, which is the public API
1425     // to tell the program to run.
1426     if (!IsHijackedForEvent(eBroadcastBitStateChanged))
1427     {
1428         if (new_state == eStateDetached)
1429         {
1430             if (log)
1431                 log->Printf("Process::SetPublicState (%s) -- unlocking run lock for detach", StateAsCString(new_state));
1432             m_run_lock.WriteUnlock();
1433         }
1434         else
1435         {
1436             const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
1437             const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
1438             if (old_state_is_stopped != new_state_is_stopped)
1439             {
1440                 if (new_state_is_stopped)
1441                 {
1442                     if (log)
1443                         log->Printf("Process::SetPublicState (%s) -- unlocking run lock", StateAsCString(new_state));
1444                     m_run_lock.WriteUnlock();
1445                 }
1446             }
1447         }
1448     }
1449 }
1450 
1451 Error
1452 Process::Resume ()
1453 {
1454     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1455     if (log)
1456         log->Printf("Process::Resume -- locking run lock");
1457     if (!m_run_lock.WriteTryLock())
1458     {
1459         Error error("Resume request failed - process still running.");
1460         if (log)
1461             log->Printf ("Process::Resume: -- WriteTryLock failed, not resuming.");
1462         return error;
1463     }
1464     return PrivateResume();
1465 }
1466 
1467 StateType
1468 Process::GetPrivateState ()
1469 {
1470     return m_private_state.GetValue();
1471 }
1472 
1473 void
1474 Process::SetPrivateState (StateType new_state)
1475 {
1476     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1477     bool state_changed = false;
1478 
1479     if (log)
1480         log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state));
1481 
1482     Mutex::Locker locker(m_private_state.GetMutex());
1483 
1484     const StateType old_state = m_private_state.GetValueNoLock ();
1485     state_changed = old_state != new_state;
1486     // This code is left commented out in case we ever need to control
1487     // the private process state with another run lock. Right now it doesn't
1488     // seem like we need to do this, but if we ever do, we can uncomment and
1489     // use this code.
1490 //    const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
1491 //    const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
1492 //    if (old_state_is_stopped != new_state_is_stopped)
1493 //    {
1494 //        if (new_state_is_stopped)
1495 //            m_private_run_lock.WriteUnlock();
1496 //        else
1497 //            m_private_run_lock.WriteLock();
1498 //    }
1499 
1500     if (state_changed)
1501     {
1502         m_private_state.SetValueNoLock (new_state);
1503         if (StateIsStoppedState(new_state, false))
1504         {
1505             m_mod_id.BumpStopID();
1506             m_memory_cache.Clear();
1507             if (log)
1508                 log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID());
1509         }
1510         // Use our target to get a shared pointer to ourselves...
1511         m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (GetTarget().GetProcessSP(), new_state));
1512     }
1513     else
1514     {
1515         if (log)
1516             log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state));
1517     }
1518 }
1519 
1520 void
1521 Process::SetRunningUserExpression (bool on)
1522 {
1523     m_mod_id.SetRunningUserExpression (on);
1524 }
1525 
1526 addr_t
1527 Process::GetImageInfoAddress()
1528 {
1529     return LLDB_INVALID_ADDRESS;
1530 }
1531 
1532 //----------------------------------------------------------------------
1533 // LoadImage
1534 //
1535 // This function provides a default implementation that works for most
1536 // unix variants. Any Process subclasses that need to do shared library
1537 // loading differently should override LoadImage and UnloadImage and
1538 // do what is needed.
1539 //----------------------------------------------------------------------
1540 uint32_t
1541 Process::LoadImage (const FileSpec &image_spec, Error &error)
1542 {
1543     char path[PATH_MAX];
1544     image_spec.GetPath(path, sizeof(path));
1545 
1546     DynamicLoader *loader = GetDynamicLoader();
1547     if (loader)
1548     {
1549         error = loader->CanLoadImage();
1550         if (error.Fail())
1551             return LLDB_INVALID_IMAGE_TOKEN;
1552     }
1553 
1554     if (error.Success())
1555     {
1556         ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
1557 
1558         if (thread_sp)
1559         {
1560             StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
1561 
1562             if (frame_sp)
1563             {
1564                 ExecutionContext exe_ctx;
1565                 frame_sp->CalculateExecutionContext (exe_ctx);
1566                 bool unwind_on_error = true;
1567                 StreamString expr;
1568                 expr.Printf("dlopen (\"%s\", 2)", path);
1569                 const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n";
1570                 lldb::ValueObjectSP result_valobj_sp;
1571                 ClangUserExpression::Evaluate (exe_ctx, eExecutionPolicyAlways, lldb::eLanguageTypeUnknown, ClangUserExpression::eResultTypeAny, unwind_on_error, expr.GetData(), prefix, result_valobj_sp);
1572                 error = result_valobj_sp->GetError();
1573                 if (error.Success())
1574                 {
1575                     Scalar scalar;
1576                     if (result_valobj_sp->ResolveValue (scalar))
1577                     {
1578                         addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1579                         if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS)
1580                         {
1581                             uint32_t image_token = m_image_tokens.size();
1582                             m_image_tokens.push_back (image_ptr);
1583                             return image_token;
1584                         }
1585                     }
1586                 }
1587             }
1588         }
1589     }
1590     if (!error.AsCString())
1591         error.SetErrorStringWithFormat("unable to load '%s'", path);
1592     return LLDB_INVALID_IMAGE_TOKEN;
1593 }
1594 
1595 //----------------------------------------------------------------------
1596 // UnloadImage
1597 //
1598 // This function provides a default implementation that works for most
1599 // unix variants. Any Process subclasses that need to do shared library
1600 // loading differently should override LoadImage and UnloadImage and
1601 // do what is needed.
1602 //----------------------------------------------------------------------
1603 Error
1604 Process::UnloadImage (uint32_t image_token)
1605 {
1606     Error error;
1607     if (image_token < m_image_tokens.size())
1608     {
1609         const addr_t image_addr = m_image_tokens[image_token];
1610         if (image_addr == LLDB_INVALID_ADDRESS)
1611         {
1612             error.SetErrorString("image already unloaded");
1613         }
1614         else
1615         {
1616             DynamicLoader *loader = GetDynamicLoader();
1617             if (loader)
1618                 error = loader->CanLoadImage();
1619 
1620             if (error.Success())
1621             {
1622                 ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
1623 
1624                 if (thread_sp)
1625                 {
1626                     StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
1627 
1628                     if (frame_sp)
1629                     {
1630                         ExecutionContext exe_ctx;
1631                         frame_sp->CalculateExecutionContext (exe_ctx);
1632                         bool unwind_on_error = true;
1633                         StreamString expr;
1634                         expr.Printf("dlclose ((void *)0x%llx)", image_addr);
1635                         const char *prefix = "extern \"C\" int dlclose(void* handle);\n";
1636                         lldb::ValueObjectSP result_valobj_sp;
1637                         ClangUserExpression::Evaluate (exe_ctx, eExecutionPolicyAlways, lldb::eLanguageTypeUnknown, ClangUserExpression::eResultTypeAny, unwind_on_error, expr.GetData(), prefix, result_valobj_sp);
1638                         if (result_valobj_sp->GetError().Success())
1639                         {
1640                             Scalar scalar;
1641                             if (result_valobj_sp->ResolveValue (scalar))
1642                             {
1643                                 if (scalar.UInt(1))
1644                                 {
1645                                     error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData());
1646                                 }
1647                                 else
1648                                 {
1649                                     m_image_tokens[image_token] = LLDB_INVALID_ADDRESS;
1650                                 }
1651                             }
1652                         }
1653                         else
1654                         {
1655                             error = result_valobj_sp->GetError();
1656                         }
1657                     }
1658                 }
1659             }
1660         }
1661     }
1662     else
1663     {
1664         error.SetErrorString("invalid image token");
1665     }
1666     return error;
1667 }
1668 
1669 const lldb::ABISP &
1670 Process::GetABI()
1671 {
1672     if (!m_abi_sp)
1673         m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture());
1674     return m_abi_sp;
1675 }
1676 
1677 LanguageRuntime *
1678 Process::GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null)
1679 {
1680     LanguageRuntimeCollection::iterator pos;
1681     pos = m_language_runtimes.find (language);
1682     if (pos == m_language_runtimes.end() || (retry_if_null && !(*pos).second))
1683     {
1684         lldb::LanguageRuntimeSP runtime_sp(LanguageRuntime::FindPlugin(this, language));
1685 
1686         m_language_runtimes[language] = runtime_sp;
1687         return runtime_sp.get();
1688     }
1689     else
1690         return (*pos).second.get();
1691 }
1692 
1693 CPPLanguageRuntime *
1694 Process::GetCPPLanguageRuntime (bool retry_if_null)
1695 {
1696     LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus, retry_if_null);
1697     if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus)
1698         return static_cast<CPPLanguageRuntime *> (runtime);
1699     return NULL;
1700 }
1701 
1702 ObjCLanguageRuntime *
1703 Process::GetObjCLanguageRuntime (bool retry_if_null)
1704 {
1705     LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC, retry_if_null);
1706     if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC)
1707         return static_cast<ObjCLanguageRuntime *> (runtime);
1708     return NULL;
1709 }
1710 
1711 bool
1712 Process::IsPossibleDynamicValue (ValueObject& in_value)
1713 {
1714     if (in_value.IsDynamic())
1715         return false;
1716     LanguageType known_type = in_value.GetObjectRuntimeLanguage();
1717 
1718     if (known_type != eLanguageTypeUnknown && known_type != eLanguageTypeC)
1719     {
1720         LanguageRuntime *runtime = GetLanguageRuntime (known_type);
1721         return runtime ? runtime->CouldHaveDynamicValue(in_value) : false;
1722     }
1723 
1724     LanguageRuntime *cpp_runtime = GetLanguageRuntime (eLanguageTypeC_plus_plus);
1725     if (cpp_runtime && cpp_runtime->CouldHaveDynamicValue(in_value))
1726         return true;
1727 
1728     LanguageRuntime *objc_runtime = GetLanguageRuntime (eLanguageTypeObjC);
1729     return objc_runtime ? objc_runtime->CouldHaveDynamicValue(in_value) : false;
1730 }
1731 
1732 BreakpointSiteList &
1733 Process::GetBreakpointSiteList()
1734 {
1735     return m_breakpoint_site_list;
1736 }
1737 
1738 const BreakpointSiteList &
1739 Process::GetBreakpointSiteList() const
1740 {
1741     return m_breakpoint_site_list;
1742 }
1743 
1744 
1745 void
1746 Process::DisableAllBreakpointSites ()
1747 {
1748     m_breakpoint_site_list.SetEnabledForAll (false);
1749     size_t num_sites = m_breakpoint_site_list.GetSize();
1750     for (size_t i = 0; i < num_sites; i++)
1751     {
1752         DisableBreakpoint (m_breakpoint_site_list.GetByIndex(i).get());
1753     }
1754 }
1755 
1756 Error
1757 Process::ClearBreakpointSiteByID (lldb::user_id_t break_id)
1758 {
1759     Error error (DisableBreakpointSiteByID (break_id));
1760 
1761     if (error.Success())
1762         m_breakpoint_site_list.Remove(break_id);
1763 
1764     return error;
1765 }
1766 
1767 Error
1768 Process::DisableBreakpointSiteByID (lldb::user_id_t break_id)
1769 {
1770     Error error;
1771     BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
1772     if (bp_site_sp)
1773     {
1774         if (bp_site_sp->IsEnabled())
1775             error = DisableBreakpoint (bp_site_sp.get());
1776     }
1777     else
1778     {
1779         error.SetErrorStringWithFormat("invalid breakpoint site ID: %llu", break_id);
1780     }
1781 
1782     return error;
1783 }
1784 
1785 Error
1786 Process::EnableBreakpointSiteByID (lldb::user_id_t break_id)
1787 {
1788     Error error;
1789     BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
1790     if (bp_site_sp)
1791     {
1792         if (!bp_site_sp->IsEnabled())
1793             error = EnableBreakpoint (bp_site_sp.get());
1794     }
1795     else
1796     {
1797         error.SetErrorStringWithFormat("invalid breakpoint site ID: %llu", break_id);
1798     }
1799     return error;
1800 }
1801 
1802 lldb::break_id_t
1803 Process::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware)
1804 {
1805     const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target);
1806     if (load_addr != LLDB_INVALID_ADDRESS)
1807     {
1808         BreakpointSiteSP bp_site_sp;
1809 
1810         // Look up this breakpoint site.  If it exists, then add this new owner, otherwise
1811         // create a new breakpoint site and add it.
1812 
1813         bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr);
1814 
1815         if (bp_site_sp)
1816         {
1817             bp_site_sp->AddOwner (owner);
1818             owner->SetBreakpointSite (bp_site_sp);
1819             return bp_site_sp->GetID();
1820         }
1821         else
1822         {
1823             bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, LLDB_INVALID_THREAD_ID, use_hardware));
1824             if (bp_site_sp)
1825             {
1826                 if (EnableBreakpoint (bp_site_sp.get()).Success())
1827                 {
1828                     owner->SetBreakpointSite (bp_site_sp);
1829                     return m_breakpoint_site_list.Add (bp_site_sp);
1830                 }
1831             }
1832         }
1833     }
1834     // We failed to enable the breakpoint
1835     return LLDB_INVALID_BREAK_ID;
1836 
1837 }
1838 
1839 void
1840 Process::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp)
1841 {
1842     uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id);
1843     if (num_owners == 0)
1844     {
1845         DisableBreakpoint(bp_site_sp.get());
1846         m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress());
1847     }
1848 }
1849 
1850 
1851 size_t
1852 Process::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const
1853 {
1854     size_t bytes_removed = 0;
1855     addr_t intersect_addr;
1856     size_t intersect_size;
1857     size_t opcode_offset;
1858     size_t idx;
1859     BreakpointSiteSP bp_sp;
1860     BreakpointSiteList bp_sites_in_range;
1861 
1862     if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range))
1863     {
1864         for (idx = 0; (bp_sp = bp_sites_in_range.GetByIndex(idx)); ++idx)
1865         {
1866             if (bp_sp->GetType() == BreakpointSite::eSoftware)
1867             {
1868                 if (bp_sp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset))
1869                 {
1870                     assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
1871                     assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size);
1872                     assert(opcode_offset + intersect_size <= bp_sp->GetByteSize());
1873                     size_t buf_offset = intersect_addr - bp_addr;
1874                     ::memcpy(buf + buf_offset, bp_sp->GetSavedOpcodeBytes() + opcode_offset, intersect_size);
1875                 }
1876             }
1877         }
1878     }
1879     return bytes_removed;
1880 }
1881 
1882 
1883 
1884 size_t
1885 Process::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site)
1886 {
1887     PlatformSP platform_sp (m_target.GetPlatform());
1888     if (platform_sp)
1889         return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site);
1890     return 0;
1891 }
1892 
1893 Error
1894 Process::EnableSoftwareBreakpoint (BreakpointSite *bp_site)
1895 {
1896     Error error;
1897     assert (bp_site != NULL);
1898     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
1899     const addr_t bp_addr = bp_site->GetLoadAddress();
1900     if (log)
1901         log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx", bp_site->GetID(), (uint64_t)bp_addr);
1902     if (bp_site->IsEnabled())
1903     {
1904         if (log)
1905             log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already enabled", bp_site->GetID(), (uint64_t)bp_addr);
1906         return error;
1907     }
1908 
1909     if (bp_addr == LLDB_INVALID_ADDRESS)
1910     {
1911         error.SetErrorString("BreakpointSite contains an invalid load address.");
1912         return error;
1913     }
1914     // Ask the lldb::Process subclass to fill in the correct software breakpoint
1915     // trap for the breakpoint site
1916     const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site);
1917 
1918     if (bp_opcode_size == 0)
1919     {
1920         error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%llx", bp_addr);
1921     }
1922     else
1923     {
1924         const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes();
1925 
1926         if (bp_opcode_bytes == NULL)
1927         {
1928             error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode.");
1929             return error;
1930         }
1931 
1932         // Save the original opcode by reading it
1933         if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size)
1934         {
1935             // Write a software breakpoint in place of the original opcode
1936             if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
1937             {
1938                 uint8_t verify_bp_opcode_bytes[64];
1939                 if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
1940                 {
1941                     if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0)
1942                     {
1943                         bp_site->SetEnabled(true);
1944                         bp_site->SetType (BreakpointSite::eSoftware);
1945                         if (log)
1946                             log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS",
1947                                          bp_site->GetID(),
1948                                          (uint64_t)bp_addr);
1949                     }
1950                     else
1951                         error.SetErrorString("failed to verify the breakpoint trap in memory.");
1952                 }
1953                 else
1954                     error.SetErrorString("Unable to read memory to verify breakpoint trap.");
1955             }
1956             else
1957                 error.SetErrorString("Unable to write breakpoint trap to memory.");
1958         }
1959         else
1960             error.SetErrorString("Unable to read memory at breakpoint address.");
1961     }
1962     if (log && error.Fail())
1963         log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s",
1964                      bp_site->GetID(),
1965                      (uint64_t)bp_addr,
1966                      error.AsCString());
1967     return error;
1968 }
1969 
1970 Error
1971 Process::DisableSoftwareBreakpoint (BreakpointSite *bp_site)
1972 {
1973     Error error;
1974     assert (bp_site != NULL);
1975     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
1976     addr_t bp_addr = bp_site->GetLoadAddress();
1977     lldb::user_id_t breakID = bp_site->GetID();
1978     if (log)
1979         log->Printf ("Process::DisableBreakpoint (breakID = %llu) addr = 0x%llx", breakID, (uint64_t)bp_addr);
1980 
1981     if (bp_site->IsHardware())
1982     {
1983         error.SetErrorString("Breakpoint site is a hardware breakpoint.");
1984     }
1985     else if (bp_site->IsEnabled())
1986     {
1987         const size_t break_op_size = bp_site->GetByteSize();
1988         const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes();
1989         if (break_op_size > 0)
1990         {
1991             // Clear a software breakoint instruction
1992             uint8_t curr_break_op[8];
1993             assert (break_op_size <= sizeof(curr_break_op));
1994             bool break_op_found = false;
1995 
1996             // Read the breakpoint opcode
1997             if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size)
1998             {
1999                 bool verify = false;
2000                 // Make sure we have the a breakpoint opcode exists at this address
2001                 if (::memcmp (curr_break_op, break_op, break_op_size) == 0)
2002                 {
2003                     break_op_found = true;
2004                     // We found a valid breakpoint opcode at this address, now restore
2005                     // the saved opcode.
2006                     if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size)
2007                     {
2008                         verify = true;
2009                     }
2010                     else
2011                         error.SetErrorString("Memory write failed when restoring original opcode.");
2012                 }
2013                 else
2014                 {
2015                     error.SetErrorString("Original breakpoint trap is no longer in memory.");
2016                     // Set verify to true and so we can check if the original opcode has already been restored
2017                     verify = true;
2018                 }
2019 
2020                 if (verify)
2021                 {
2022                     uint8_t verify_opcode[8];
2023                     assert (break_op_size < sizeof(verify_opcode));
2024                     // Verify that our original opcode made it back to the inferior
2025                     if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size)
2026                     {
2027                         // compare the memory we just read with the original opcode
2028                         if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0)
2029                         {
2030                             // SUCCESS
2031                             bp_site->SetEnabled(false);
2032                             if (log)
2033                                 log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr);
2034                             return error;
2035                         }
2036                         else
2037                         {
2038                             if (break_op_found)
2039                                 error.SetErrorString("Failed to restore original opcode.");
2040                         }
2041                     }
2042                     else
2043                         error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored.");
2044                 }
2045             }
2046             else
2047                 error.SetErrorString("Unable to read memory that should contain the breakpoint trap.");
2048         }
2049     }
2050     else
2051     {
2052         if (log)
2053             log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already disabled", bp_site->GetID(), (uint64_t)bp_addr);
2054         return error;
2055     }
2056 
2057     if (log)
2058         log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s",
2059                      bp_site->GetID(),
2060                      (uint64_t)bp_addr,
2061                      error.AsCString());
2062     return error;
2063 
2064 }
2065 
2066 // Uncomment to verify memory caching works after making changes to caching code
2067 //#define VERIFY_MEMORY_READS
2068 
2069 size_t
2070 Process::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
2071 {
2072     if (!GetDisableMemoryCache())
2073     {
2074 #if defined (VERIFY_MEMORY_READS)
2075         // Memory caching is enabled, with debug verification
2076 
2077         if (buf && size)
2078         {
2079             // Uncomment the line below to make sure memory caching is working.
2080             // I ran this through the test suite and got no assertions, so I am
2081             // pretty confident this is working well. If any changes are made to
2082             // memory caching, uncomment the line below and test your changes!
2083 
2084             // Verify all memory reads by using the cache first, then redundantly
2085             // reading the same memory from the inferior and comparing to make sure
2086             // everything is exactly the same.
2087             std::string verify_buf (size, '\0');
2088             assert (verify_buf.size() == size);
2089             const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error);
2090             Error verify_error;
2091             const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error);
2092             assert (cache_bytes_read == verify_bytes_read);
2093             assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0);
2094             assert (verify_error.Success() == error.Success());
2095             return cache_bytes_read;
2096         }
2097         return 0;
2098 #else // !defined(VERIFY_MEMORY_READS)
2099         // Memory caching is enabled, without debug verification
2100 
2101         return m_memory_cache.Read (addr, buf, size, error);
2102 #endif // defined (VERIFY_MEMORY_READS)
2103     }
2104     else
2105     {
2106         // Memory caching is disabled
2107 
2108         return ReadMemoryFromInferior (addr, buf, size, error);
2109     }
2110 }
2111 
2112 size_t
2113 Process::ReadCStringFromMemory (addr_t addr, std::string &out_str, Error &error)
2114 {
2115     char buf[256];
2116     out_str.clear();
2117     addr_t curr_addr = addr;
2118     while (1)
2119     {
2120         size_t length = ReadCStringFromMemory (curr_addr, buf, sizeof(buf), error);
2121         if (length == 0)
2122             break;
2123         out_str.append(buf, length);
2124         // If we got "length - 1" bytes, we didn't get the whole C string, we
2125         // need to read some more characters
2126         if (length == sizeof(buf) - 1)
2127             curr_addr += length;
2128         else
2129             break;
2130     }
2131     return out_str.size();
2132 }
2133 
2134 
2135 size_t
2136 Process::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len, Error &result_error)
2137 {
2138     size_t total_cstr_len = 0;
2139     if (dst && dst_max_len)
2140     {
2141         result_error.Clear();
2142         // NULL out everything just to be safe
2143         memset (dst, 0, dst_max_len);
2144         Error error;
2145         addr_t curr_addr = addr;
2146         const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
2147         size_t bytes_left = dst_max_len - 1;
2148         char *curr_dst = dst;
2149 
2150         while (bytes_left > 0)
2151         {
2152             addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
2153             addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
2154             size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error);
2155 
2156             if (bytes_read == 0)
2157             {
2158                 result_error = error;
2159                 dst[total_cstr_len] = '\0';
2160                 break;
2161             }
2162             const size_t len = strlen(curr_dst);
2163 
2164             total_cstr_len += len;
2165 
2166             if (len < bytes_to_read)
2167                 break;
2168 
2169             curr_dst += bytes_read;
2170             curr_addr += bytes_read;
2171             bytes_left -= bytes_read;
2172         }
2173     }
2174     else
2175     {
2176         if (dst == NULL)
2177             result_error.SetErrorString("invalid arguments");
2178         else
2179             result_error.Clear();
2180     }
2181     return total_cstr_len;
2182 }
2183 
2184 size_t
2185 Process::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error)
2186 {
2187     if (buf == NULL || size == 0)
2188         return 0;
2189 
2190     size_t bytes_read = 0;
2191     uint8_t *bytes = (uint8_t *)buf;
2192 
2193     while (bytes_read < size)
2194     {
2195         const size_t curr_size = size - bytes_read;
2196         const size_t curr_bytes_read = DoReadMemory (addr + bytes_read,
2197                                                      bytes + bytes_read,
2198                                                      curr_size,
2199                                                      error);
2200         bytes_read += curr_bytes_read;
2201         if (curr_bytes_read == curr_size || curr_bytes_read == 0)
2202             break;
2203     }
2204 
2205     // Replace any software breakpoint opcodes that fall into this range back
2206     // into "buf" before we return
2207     if (bytes_read > 0)
2208         RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf);
2209     return bytes_read;
2210 }
2211 
2212 uint64_t
2213 Process::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error)
2214 {
2215     Scalar scalar;
2216     if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error))
2217         return scalar.ULongLong(fail_value);
2218     return fail_value;
2219 }
2220 
2221 addr_t
2222 Process::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error)
2223 {
2224     Scalar scalar;
2225     if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error))
2226         return scalar.ULongLong(LLDB_INVALID_ADDRESS);
2227     return LLDB_INVALID_ADDRESS;
2228 }
2229 
2230 
2231 bool
2232 Process::WritePointerToMemory (lldb::addr_t vm_addr,
2233                                lldb::addr_t ptr_value,
2234                                Error &error)
2235 {
2236     Scalar scalar;
2237     const uint32_t addr_byte_size = GetAddressByteSize();
2238     if (addr_byte_size <= 4)
2239         scalar = (uint32_t)ptr_value;
2240     else
2241         scalar = ptr_value;
2242     return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size;
2243 }
2244 
2245 size_t
2246 Process::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error)
2247 {
2248     size_t bytes_written = 0;
2249     const uint8_t *bytes = (const uint8_t *)buf;
2250 
2251     while (bytes_written < size)
2252     {
2253         const size_t curr_size = size - bytes_written;
2254         const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written,
2255                                                          bytes + bytes_written,
2256                                                          curr_size,
2257                                                          error);
2258         bytes_written += curr_bytes_written;
2259         if (curr_bytes_written == curr_size || curr_bytes_written == 0)
2260             break;
2261     }
2262     return bytes_written;
2263 }
2264 
2265 size_t
2266 Process::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
2267 {
2268 #if defined (ENABLE_MEMORY_CACHING)
2269     m_memory_cache.Flush (addr, size);
2270 #endif
2271 
2272     if (buf == NULL || size == 0)
2273         return 0;
2274 
2275     m_mod_id.BumpMemoryID();
2276 
2277     // We need to write any data that would go where any current software traps
2278     // (enabled software breakpoints) any software traps (breakpoints) that we
2279     // may have placed in our tasks memory.
2280 
2281     BreakpointSiteList::collection::const_iterator iter = m_breakpoint_site_list.GetMap()->lower_bound (addr);
2282     BreakpointSiteList::collection::const_iterator end =  m_breakpoint_site_list.GetMap()->end();
2283 
2284     if (iter == end || iter->second->GetLoadAddress() > addr + size)
2285         return WriteMemoryPrivate (addr, buf, size, error);
2286 
2287     BreakpointSiteList::collection::const_iterator pos;
2288     size_t bytes_written = 0;
2289     addr_t intersect_addr = 0;
2290     size_t intersect_size = 0;
2291     size_t opcode_offset = 0;
2292     const uint8_t *ubuf = (const uint8_t *)buf;
2293 
2294     for (pos = iter; pos != end; ++pos)
2295     {
2296         BreakpointSiteSP bp;
2297         bp = pos->second;
2298 
2299         assert(bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset));
2300         assert(addr <= intersect_addr && intersect_addr < addr + size);
2301         assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size);
2302         assert(opcode_offset + intersect_size <= bp->GetByteSize());
2303 
2304         // Check for bytes before this breakpoint
2305         const addr_t curr_addr = addr + bytes_written;
2306         if (intersect_addr > curr_addr)
2307         {
2308             // There are some bytes before this breakpoint that we need to
2309             // just write to memory
2310             size_t curr_size = intersect_addr - curr_addr;
2311             size_t curr_bytes_written = WriteMemoryPrivate (curr_addr,
2312                                                             ubuf + bytes_written,
2313                                                             curr_size,
2314                                                             error);
2315             bytes_written += curr_bytes_written;
2316             if (curr_bytes_written != curr_size)
2317             {
2318                 // We weren't able to write all of the requested bytes, we
2319                 // are done looping and will return the number of bytes that
2320                 // we have written so far.
2321                 break;
2322             }
2323         }
2324 
2325         // Now write any bytes that would cover up any software breakpoints
2326         // directly into the breakpoint opcode buffer
2327         ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size);
2328         bytes_written += intersect_size;
2329     }
2330 
2331     // Write any remaining bytes after the last breakpoint if we have any left
2332     if (bytes_written < size)
2333         bytes_written += WriteMemoryPrivate (addr + bytes_written,
2334                                              ubuf + bytes_written,
2335                                              size - bytes_written,
2336                                              error);
2337 
2338     return bytes_written;
2339 }
2340 
2341 size_t
2342 Process::WriteScalarToMemory (addr_t addr, const Scalar &scalar, uint32_t byte_size, Error &error)
2343 {
2344     if (byte_size == UINT32_MAX)
2345         byte_size = scalar.GetByteSize();
2346     if (byte_size > 0)
2347     {
2348         uint8_t buf[32];
2349         const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error);
2350         if (mem_size > 0)
2351             return WriteMemory(addr, buf, mem_size, error);
2352         else
2353             error.SetErrorString ("failed to get scalar as memory data");
2354     }
2355     else
2356     {
2357         error.SetErrorString ("invalid scalar value");
2358     }
2359     return 0;
2360 }
2361 
2362 size_t
2363 Process::ReadScalarIntegerFromMemory (addr_t addr,
2364                                       uint32_t byte_size,
2365                                       bool is_signed,
2366                                       Scalar &scalar,
2367                                       Error &error)
2368 {
2369     uint64_t uval;
2370 
2371     if (byte_size <= sizeof(uval))
2372     {
2373         size_t bytes_read = ReadMemory (addr, &uval, byte_size, error);
2374         if (bytes_read == byte_size)
2375         {
2376             DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize());
2377             uint32_t offset = 0;
2378             if (byte_size <= 4)
2379                 scalar = data.GetMaxU32 (&offset, byte_size);
2380             else
2381                 scalar = data.GetMaxU64 (&offset, byte_size);
2382 
2383             if (is_signed)
2384                 scalar.SignExtend(byte_size * 8);
2385             return bytes_read;
2386         }
2387     }
2388     else
2389     {
2390         error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
2391     }
2392     return 0;
2393 }
2394 
2395 #define USE_ALLOCATE_MEMORY_CACHE 1
2396 addr_t
2397 Process::AllocateMemory(size_t size, uint32_t permissions, Error &error)
2398 {
2399     if (GetPrivateState() != eStateStopped)
2400         return LLDB_INVALID_ADDRESS;
2401 
2402 #if defined (USE_ALLOCATE_MEMORY_CACHE)
2403     return m_allocated_memory_cache.AllocateMemory(size, permissions, error);
2404 #else
2405     addr_t allocated_addr = DoAllocateMemory (size, permissions, error);
2406     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2407     if (log)
2408         log->Printf("Process::AllocateMemory(size=%4zu, permissions=%s) => 0x%16.16llx (m_stop_id = %u m_memory_id = %u)",
2409                     size,
2410                     GetPermissionsAsCString (permissions),
2411                     (uint64_t)allocated_addr,
2412                     m_mod_id.GetStopID(),
2413                     m_mod_id.GetMemoryID());
2414     return allocated_addr;
2415 #endif
2416 }
2417 
2418 bool
2419 Process::CanJIT ()
2420 {
2421     if (m_can_jit == eCanJITDontKnow)
2422     {
2423         Error err;
2424 
2425         uint64_t allocated_memory = AllocateMemory(8,
2426                                                    ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable,
2427                                                    err);
2428 
2429         if (err.Success())
2430             m_can_jit = eCanJITYes;
2431         else
2432             m_can_jit = eCanJITNo;
2433 
2434         DeallocateMemory (allocated_memory);
2435     }
2436 
2437     return m_can_jit == eCanJITYes;
2438 }
2439 
2440 void
2441 Process::SetCanJIT (bool can_jit)
2442 {
2443     m_can_jit = (can_jit ? eCanJITYes : eCanJITNo);
2444 }
2445 
2446 Error
2447 Process::DeallocateMemory (addr_t ptr)
2448 {
2449     Error error;
2450 #if defined (USE_ALLOCATE_MEMORY_CACHE)
2451     if (!m_allocated_memory_cache.DeallocateMemory(ptr))
2452     {
2453         error.SetErrorStringWithFormat ("deallocation of memory at 0x%llx failed.", (uint64_t)ptr);
2454     }
2455 #else
2456     error = DoDeallocateMemory (ptr);
2457 
2458     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2459     if (log)
2460         log->Printf("Process::DeallocateMemory(addr=0x%16.16llx) => err = %s (m_stop_id = %u, m_memory_id = %u)",
2461                     ptr,
2462                     error.AsCString("SUCCESS"),
2463                     m_mod_id.GetStopID(),
2464                     m_mod_id.GetMemoryID());
2465 #endif
2466     return error;
2467 }
2468 
2469 ModuleSP
2470 Process::ReadModuleFromMemory (const FileSpec& file_spec,
2471                                lldb::addr_t header_addr,
2472                                bool add_image_to_target,
2473                                bool load_sections_in_target)
2474 {
2475     ModuleSP module_sp (new Module (file_spec, ArchSpec()));
2476     if (module_sp)
2477     {
2478         Error error;
2479         ObjectFile *objfile = module_sp->GetMemoryObjectFile (shared_from_this(), header_addr, error);
2480         if (objfile)
2481         {
2482             if (add_image_to_target)
2483             {
2484                 m_target.GetImages().Append(module_sp);
2485                 if (load_sections_in_target)
2486                 {
2487                     bool changed = false;
2488                     module_sp->SetLoadAddress (m_target, 0, changed);
2489                 }
2490             }
2491             return module_sp;
2492         }
2493     }
2494     return ModuleSP();
2495 }
2496 
2497 Error
2498 Process::EnableWatchpoint (Watchpoint *watchpoint)
2499 {
2500     Error error;
2501     error.SetErrorString("watchpoints are not supported");
2502     return error;
2503 }
2504 
2505 Error
2506 Process::DisableWatchpoint (Watchpoint *watchpoint)
2507 {
2508     Error error;
2509     error.SetErrorString("watchpoints are not supported");
2510     return error;
2511 }
2512 
2513 StateType
2514 Process::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp)
2515 {
2516     StateType state;
2517     // Now wait for the process to launch and return control to us, and then
2518     // call DidLaunch:
2519     while (1)
2520     {
2521         event_sp.reset();
2522         state = WaitForStateChangedEventsPrivate (timeout, event_sp);
2523 
2524         if (StateIsStoppedState(state, false))
2525             break;
2526 
2527         // If state is invalid, then we timed out
2528         if (state == eStateInvalid)
2529             break;
2530 
2531         if (event_sp)
2532             HandlePrivateEvent (event_sp);
2533     }
2534     return state;
2535 }
2536 
2537 Error
2538 Process::Launch (const ProcessLaunchInfo &launch_info)
2539 {
2540     Error error;
2541     m_abi_sp.reset();
2542     m_dyld_ap.reset();
2543     m_os_ap.reset();
2544     m_process_input_reader.reset();
2545 
2546     Module *exe_module = m_target.GetExecutableModulePointer();
2547     if (exe_module)
2548     {
2549         char local_exec_file_path[PATH_MAX];
2550         char platform_exec_file_path[PATH_MAX];
2551         exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path));
2552         exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path));
2553         if (exe_module->GetFileSpec().Exists())
2554         {
2555             if (PrivateStateThreadIsValid ())
2556                 PausePrivateStateThread ();
2557 
2558             error = WillLaunch (exe_module);
2559             if (error.Success())
2560             {
2561                 SetPublicState (eStateLaunching);
2562                 m_should_detach = false;
2563 
2564                 // Now launch using these arguments.
2565                 error = DoLaunch (exe_module, launch_info);
2566 
2567                 if (error.Fail())
2568                 {
2569                     if (GetID() != LLDB_INVALID_PROCESS_ID)
2570                     {
2571                         SetID (LLDB_INVALID_PROCESS_ID);
2572                         const char *error_string = error.AsCString();
2573                         if (error_string == NULL)
2574                             error_string = "launch failed";
2575                         SetExitStatus (-1, error_string);
2576                     }
2577                 }
2578                 else
2579                 {
2580                     EventSP event_sp;
2581                     TimeValue timeout_time;
2582                     timeout_time = TimeValue::Now();
2583                     timeout_time.OffsetWithSeconds(10);
2584                     StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp);
2585 
2586                     if (state == eStateInvalid || event_sp.get() == NULL)
2587                     {
2588                         // We were able to launch the process, but we failed to
2589                         // catch the initial stop.
2590                         SetExitStatus (0, "failed to catch stop after launch");
2591                         Destroy();
2592                     }
2593                     else if (state == eStateStopped || state == eStateCrashed)
2594                     {
2595 
2596                         DidLaunch ();
2597 
2598                         DynamicLoader *dyld = GetDynamicLoader ();
2599                         if (dyld)
2600                             dyld->DidLaunch();
2601 
2602                         m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
2603                         // This delays passing the stopped event to listeners till DidLaunch gets
2604                         // a chance to complete...
2605                         HandlePrivateEvent (event_sp);
2606 
2607                         if (PrivateStateThreadIsValid ())
2608                             ResumePrivateStateThread ();
2609                         else
2610                             StartPrivateStateThread ();
2611                     }
2612                     else if (state == eStateExited)
2613                     {
2614                         // We exited while trying to launch somehow.  Don't call DidLaunch as that's
2615                         // not likely to work, and return an invalid pid.
2616                         HandlePrivateEvent (event_sp);
2617                     }
2618                 }
2619             }
2620         }
2621         else
2622         {
2623             error.SetErrorStringWithFormat("file doesn't exist: '%s'", local_exec_file_path);
2624         }
2625     }
2626     return error;
2627 }
2628 
2629 
2630 Error
2631 Process::LoadCore ()
2632 {
2633     Error error = DoLoadCore();
2634     if (error.Success())
2635     {
2636         if (PrivateStateThreadIsValid ())
2637             ResumePrivateStateThread ();
2638         else
2639             StartPrivateStateThread ();
2640 
2641         DynamicLoader *dyld = GetDynamicLoader ();
2642         if (dyld)
2643             dyld->DidAttach();
2644 
2645         m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
2646         // We successfully loaded a core file, now pretend we stopped so we can
2647         // show all of the threads in the core file and explore the crashed
2648         // state.
2649         SetPrivateState (eStateStopped);
2650 
2651     }
2652     return error;
2653 }
2654 
2655 DynamicLoader *
2656 Process::GetDynamicLoader ()
2657 {
2658     if (m_dyld_ap.get() == NULL)
2659         m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL));
2660     return m_dyld_ap.get();
2661 }
2662 
2663 
2664 Process::NextEventAction::EventActionResult
2665 Process::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp)
2666 {
2667     StateType state = ProcessEventData::GetStateFromEvent (event_sp.get());
2668     switch (state)
2669     {
2670         case eStateRunning:
2671         case eStateConnected:
2672             return eEventActionRetry;
2673 
2674         case eStateStopped:
2675         case eStateCrashed:
2676             {
2677                 // During attach, prior to sending the eStateStopped event,
2678                 // lldb_private::Process subclasses must set the new process ID.
2679                 assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID);
2680                 if (m_exec_count > 0)
2681                 {
2682                     --m_exec_count;
2683                     m_process->PrivateResume ();
2684                     Process::ProcessEventData::SetRestartedInEvent (event_sp.get(), true);
2685                     return eEventActionRetry;
2686                 }
2687                 else
2688                 {
2689                     m_process->CompleteAttach ();
2690                     return eEventActionSuccess;
2691                 }
2692             }
2693             break;
2694 
2695         default:
2696         case eStateExited:
2697         case eStateInvalid:
2698             break;
2699     }
2700 
2701     m_exit_string.assign ("No valid Process");
2702     return eEventActionExit;
2703 }
2704 
2705 Process::NextEventAction::EventActionResult
2706 Process::AttachCompletionHandler::HandleBeingInterrupted()
2707 {
2708     return eEventActionSuccess;
2709 }
2710 
2711 const char *
2712 Process::AttachCompletionHandler::GetExitString ()
2713 {
2714     return m_exit_string.c_str();
2715 }
2716 
2717 Error
2718 Process::Attach (ProcessAttachInfo &attach_info)
2719 {
2720     m_abi_sp.reset();
2721     m_process_input_reader.reset();
2722     m_dyld_ap.reset();
2723     m_os_ap.reset();
2724 
2725     lldb::pid_t attach_pid = attach_info.GetProcessID();
2726     Error error;
2727     if (attach_pid == LLDB_INVALID_PROCESS_ID)
2728     {
2729         char process_name[PATH_MAX];
2730 
2731         if (attach_info.GetExecutableFile().GetPath (process_name, sizeof(process_name)))
2732         {
2733             const bool wait_for_launch = attach_info.GetWaitForLaunch();
2734 
2735             if (wait_for_launch)
2736             {
2737                 error = WillAttachToProcessWithName(process_name, wait_for_launch);
2738                 if (error.Success())
2739                 {
2740                     m_should_detach = true;
2741 
2742                     SetPublicState (eStateAttaching);
2743                     error = DoAttachToProcessWithName (process_name, wait_for_launch, attach_info);
2744                     if (error.Fail())
2745                     {
2746                         if (GetID() != LLDB_INVALID_PROCESS_ID)
2747                         {
2748                             SetID (LLDB_INVALID_PROCESS_ID);
2749                             if (error.AsCString() == NULL)
2750                                 error.SetErrorString("attach failed");
2751 
2752                             SetExitStatus(-1, error.AsCString());
2753                         }
2754                     }
2755                     else
2756                     {
2757                         SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount()));
2758                         StartPrivateStateThread();
2759                     }
2760                     return error;
2761                 }
2762             }
2763             else
2764             {
2765                 ProcessInstanceInfoList process_infos;
2766                 PlatformSP platform_sp (m_target.GetPlatform ());
2767 
2768                 if (platform_sp)
2769                 {
2770                     ProcessInstanceInfoMatch match_info;
2771                     match_info.GetProcessInfo() = attach_info;
2772                     match_info.SetNameMatchType (eNameMatchEquals);
2773                     platform_sp->FindProcesses (match_info, process_infos);
2774                     const uint32_t num_matches = process_infos.GetSize();
2775                     if (num_matches == 1)
2776                     {
2777                         attach_pid = process_infos.GetProcessIDAtIndex(0);
2778                         // Fall through and attach using the above process ID
2779                     }
2780                     else
2781                     {
2782                         match_info.GetProcessInfo().GetExecutableFile().GetPath (process_name, sizeof(process_name));
2783                         if (num_matches > 1)
2784                             error.SetErrorStringWithFormat ("more than one process named %s", process_name);
2785                         else
2786                             error.SetErrorStringWithFormat ("could not find a process named %s", process_name);
2787                     }
2788                 }
2789                 else
2790                 {
2791                     error.SetErrorString ("invalid platform, can't find processes by name");
2792                     return error;
2793                 }
2794             }
2795         }
2796         else
2797         {
2798             error.SetErrorString ("invalid process name");
2799         }
2800     }
2801 
2802     if (attach_pid != LLDB_INVALID_PROCESS_ID)
2803     {
2804         error = WillAttachToProcessWithID(attach_pid);
2805         if (error.Success())
2806         {
2807             m_should_detach = true;
2808             SetPublicState (eStateAttaching);
2809 
2810             error = DoAttachToProcessWithID (attach_pid, attach_info);
2811             if (error.Success())
2812             {
2813 
2814                 SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount()));
2815                 StartPrivateStateThread();
2816             }
2817             else
2818             {
2819                 if (GetID() != LLDB_INVALID_PROCESS_ID)
2820                 {
2821                     SetID (LLDB_INVALID_PROCESS_ID);
2822                     const char *error_string = error.AsCString();
2823                     if (error_string == NULL)
2824                         error_string = "attach failed";
2825 
2826                     SetExitStatus(-1, error_string);
2827                 }
2828             }
2829         }
2830     }
2831     return error;
2832 }
2833 
2834 void
2835 Process::CompleteAttach ()
2836 {
2837     // Let the process subclass figure out at much as it can about the process
2838     // before we go looking for a dynamic loader plug-in.
2839     DidAttach();
2840 
2841     // We just attached.  If we have a platform, ask it for the process architecture, and if it isn't
2842     // the same as the one we've already set, switch architectures.
2843     PlatformSP platform_sp (m_target.GetPlatform ());
2844     assert (platform_sp.get());
2845     if (platform_sp)
2846     {
2847         const ArchSpec &target_arch = m_target.GetArchitecture();
2848         if (target_arch.IsValid() && !platform_sp->IsCompatibleArchitecture (target_arch))
2849         {
2850             ArchSpec platform_arch;
2851             platform_sp = platform_sp->GetPlatformForArchitecture (target_arch, &platform_arch);
2852             if (platform_sp)
2853             {
2854                 m_target.SetPlatform (platform_sp);
2855                 m_target.SetArchitecture(platform_arch);
2856             }
2857         }
2858         else
2859         {
2860             ProcessInstanceInfo process_info;
2861             platform_sp->GetProcessInfo (GetID(), process_info);
2862             const ArchSpec &process_arch = process_info.GetArchitecture();
2863             if (process_arch.IsValid() && m_target.GetArchitecture() != process_arch)
2864                 m_target.SetArchitecture (process_arch);
2865         }
2866     }
2867 
2868     // We have completed the attach, now it is time to find the dynamic loader
2869     // plug-in
2870     DynamicLoader *dyld = GetDynamicLoader ();
2871     if (dyld)
2872         dyld->DidAttach();
2873 
2874     m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
2875     // Figure out which one is the executable, and set that in our target:
2876     ModuleList &target_modules = m_target.GetImages();
2877     Mutex::Locker modules_locker(target_modules.GetMutex());
2878     size_t num_modules = target_modules.GetSize();
2879     ModuleSP new_executable_module_sp;
2880 
2881     for (int i = 0; i < num_modules; i++)
2882     {
2883         ModuleSP module_sp (target_modules.GetModuleAtIndexUnlocked (i));
2884         if (module_sp && module_sp->IsExecutable())
2885         {
2886             if (m_target.GetExecutableModulePointer() != module_sp.get())
2887                 new_executable_module_sp = module_sp;
2888             break;
2889         }
2890     }
2891     if (new_executable_module_sp)
2892         m_target.SetExecutableModule (new_executable_module_sp, false);
2893 }
2894 
2895 Error
2896 Process::ConnectRemote (const char *remote_url)
2897 {
2898     m_abi_sp.reset();
2899     m_process_input_reader.reset();
2900 
2901     // Find the process and its architecture.  Make sure it matches the architecture
2902     // of the current Target, and if not adjust it.
2903 
2904     Error error (DoConnectRemote (remote_url));
2905     if (error.Success())
2906     {
2907         if (GetID() != LLDB_INVALID_PROCESS_ID)
2908         {
2909             EventSP event_sp;
2910             StateType state = WaitForProcessStopPrivate(NULL, event_sp);
2911 
2912             if (state == eStateStopped || state == eStateCrashed)
2913             {
2914                 // If we attached and actually have a process on the other end, then
2915                 // this ended up being the equivalent of an attach.
2916                 CompleteAttach ();
2917 
2918                 // This delays passing the stopped event to listeners till
2919                 // CompleteAttach gets a chance to complete...
2920                 HandlePrivateEvent (event_sp);
2921 
2922             }
2923         }
2924 
2925         if (PrivateStateThreadIsValid ())
2926             ResumePrivateStateThread ();
2927         else
2928             StartPrivateStateThread ();
2929     }
2930     return error;
2931 }
2932 
2933 
2934 Error
2935 Process::PrivateResume ()
2936 {
2937     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2938     if (log)
2939         log->Printf("Process::Resume() m_stop_id = %u, public state: %s private state: %s",
2940                     m_mod_id.GetStopID(),
2941                     StateAsCString(m_public_state.GetValue()),
2942                     StateAsCString(m_private_state.GetValue()));
2943 
2944     Error error (WillResume());
2945     // Tell the process it is about to resume before the thread list
2946     if (error.Success())
2947     {
2948         // Now let the thread list know we are about to resume so it
2949         // can let all of our threads know that they are about to be
2950         // resumed. Threads will each be called with
2951         // Thread::WillResume(StateType) where StateType contains the state
2952         // that they are supposed to have when the process is resumed
2953         // (suspended/running/stepping). Threads should also check
2954         // their resume signal in lldb::Thread::GetResumeSignal()
2955         // to see if they are suppoed to start back up with a signal.
2956         if (m_thread_list.WillResume())
2957         {
2958             // Last thing, do the PreResumeActions.
2959             if (!RunPreResumeActions())
2960             {
2961                 error.SetErrorStringWithFormat ("Process::Resume PreResumeActions failed, not resuming.");
2962             }
2963             else
2964             {
2965                 m_mod_id.BumpResumeID();
2966                 error = DoResume();
2967                 if (error.Success())
2968                 {
2969                     DidResume();
2970                     m_thread_list.DidResume();
2971                     if (log)
2972                         log->Printf ("Process thinks the process has resumed.");
2973                 }
2974             }
2975         }
2976         else
2977         {
2978             // Somebody wanted to run without running.  So generate a continue & a stopped event,
2979             // and let the world handle them.
2980             if (log)
2981                 log->Printf ("Process::PrivateResume() asked to simulate a start & stop.");
2982 
2983             SetPrivateState(eStateRunning);
2984             SetPrivateState(eStateStopped);
2985         }
2986     }
2987     else if (log)
2988         log->Printf ("Process::WillResume() got an error \"%s\".", error.AsCString("<unknown error>"));
2989     return error;
2990 }
2991 
2992 Error
2993 Process::Halt ()
2994 {
2995     // First make sure we aren't in the middle of handling an event, or we might restart.  This is pretty weak, since
2996     // we could just straightaway get another event.  It just narrows the window...
2997     m_currently_handling_event.WaitForValueEqualTo(false);
2998 
2999 
3000     // Pause our private state thread so we can ensure no one else eats
3001     // the stop event out from under us.
3002     Listener halt_listener ("lldb.process.halt_listener");
3003     HijackPrivateProcessEvents(&halt_listener);
3004 
3005     EventSP event_sp;
3006     Error error (WillHalt());
3007 
3008     if (error.Success())
3009     {
3010 
3011         bool caused_stop = false;
3012 
3013         // Ask the process subclass to actually halt our process
3014         error = DoHalt(caused_stop);
3015         if (error.Success())
3016         {
3017             if (m_public_state.GetValue() == eStateAttaching)
3018             {
3019                 SetExitStatus(SIGKILL, "Cancelled async attach.");
3020                 Destroy ();
3021             }
3022             else
3023             {
3024                 // If "caused_stop" is true, then DoHalt stopped the process. If
3025                 // "caused_stop" is false, the process was already stopped.
3026                 // If the DoHalt caused the process to stop, then we want to catch
3027                 // this event and set the interrupted bool to true before we pass
3028                 // this along so clients know that the process was interrupted by
3029                 // a halt command.
3030                 if (caused_stop)
3031                 {
3032                     // Wait for 1 second for the process to stop.
3033                     TimeValue timeout_time;
3034                     timeout_time = TimeValue::Now();
3035                     timeout_time.OffsetWithSeconds(1);
3036                     bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp);
3037                     StateType state = ProcessEventData::GetStateFromEvent(event_sp.get());
3038 
3039                     if (!got_event || state == eStateInvalid)
3040                     {
3041                         // We timeout out and didn't get a stop event...
3042                         error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState()));
3043                     }
3044                     else
3045                     {
3046                         if (StateIsStoppedState (state, false))
3047                         {
3048                             // We caused the process to interrupt itself, so mark this
3049                             // as such in the stop event so clients can tell an interrupted
3050                             // process from a natural stop
3051                             ProcessEventData::SetInterruptedInEvent (event_sp.get(), true);
3052                         }
3053                         else
3054                         {
3055                             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3056                             if (log)
3057                                 log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state));
3058                             error.SetErrorString ("Did not get stopped event after halt.");
3059                         }
3060                     }
3061                 }
3062                 DidHalt();
3063             }
3064         }
3065     }
3066     // Resume our private state thread before we post the event (if any)
3067     RestorePrivateProcessEvents();
3068 
3069     // Post any event we might have consumed. If all goes well, we will have
3070     // stopped the process, intercepted the event and set the interrupted
3071     // bool in the event.  Post it to the private event queue and that will end up
3072     // correctly setting the state.
3073     if (event_sp)
3074         m_private_state_broadcaster.BroadcastEvent(event_sp);
3075 
3076     return error;
3077 }
3078 
3079 Error
3080 Process::Detach ()
3081 {
3082     Error error (WillDetach());
3083 
3084     if (error.Success())
3085     {
3086         DisableAllBreakpointSites();
3087         error = DoDetach();
3088         if (error.Success())
3089         {
3090             DidDetach();
3091             StopPrivateStateThread();
3092         }
3093     }
3094     return error;
3095 }
3096 
3097 Error
3098 Process::Destroy ()
3099 {
3100     Error error (WillDestroy());
3101     if (error.Success())
3102     {
3103         if (m_public_state.GetValue() == eStateRunning)
3104         {
3105             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TEMPORARY));
3106             if (log)
3107                 log->Printf("Process::Destroy() About to halt.");
3108             error = Halt();
3109             if (error.Success())
3110             {
3111                 // Consume the halt event.
3112                 EventSP stop_event;
3113                 TimeValue timeout (TimeValue::Now());
3114                 timeout.OffsetWithSeconds(1);
3115                 StateType state = WaitForProcessToStop (&timeout);
3116                 if (state != eStateStopped)
3117                 {
3118                     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TEMPORARY));
3119                     if (log)
3120                         log->Printf("Process::Destroy() Halt failed to stop, state is: %s", StateAsCString(state));
3121                     // If we really couldn't stop the process then we should just error out here, but if the
3122                     // lower levels just bobbled sending the event and we really are stopped, then continue on.
3123                     StateType private_state = m_private_state.GetValue();
3124                     if (private_state != eStateStopped && private_state != eStateExited)
3125                     {
3126                         return error;
3127                     }
3128                 }
3129             }
3130             else
3131             {
3132                     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TEMPORARY));
3133                     if (log)
3134                         log->Printf("Process::Destroy() Halt got error: %s", error.AsCString());
3135                     return error;
3136             }
3137         }
3138 
3139         if (m_public_state.GetValue() != eStateRunning)
3140         {
3141             // Ditch all thread plans, and remove all our breakpoints: in case we have to restart the target to
3142             // kill it, we don't want it hitting a breakpoint...
3143             // Only do this if we've stopped, however, since if we didn't manage to halt it above, then
3144             // we're not going to have much luck doing this now.
3145             m_thread_list.DiscardThreadPlans();
3146             DisableAllBreakpointSites();
3147         }
3148 
3149         error = DoDestroy();
3150         if (error.Success())
3151         {
3152             DidDestroy();
3153             StopPrivateStateThread();
3154         }
3155         m_stdio_communication.StopReadThread();
3156         m_stdio_communication.Disconnect();
3157         if (m_process_input_reader && m_process_input_reader->IsActive())
3158             m_target.GetDebugger().PopInputReader (m_process_input_reader);
3159         if (m_process_input_reader)
3160             m_process_input_reader.reset();
3161 
3162         // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating
3163         // the last events through the event system, in which case we might strand the write lock.  Unlock
3164         // it here so when we do to tear down the process we don't get an error destroying the lock.
3165         m_run_lock.WriteUnlock();
3166     }
3167     return error;
3168 }
3169 
3170 Error
3171 Process::Signal (int signal)
3172 {
3173     Error error (WillSignal());
3174     if (error.Success())
3175     {
3176         error = DoSignal(signal);
3177         if (error.Success())
3178             DidSignal();
3179     }
3180     return error;
3181 }
3182 
3183 lldb::ByteOrder
3184 Process::GetByteOrder () const
3185 {
3186     return m_target.GetArchitecture().GetByteOrder();
3187 }
3188 
3189 uint32_t
3190 Process::GetAddressByteSize () const
3191 {
3192     return m_target.GetArchitecture().GetAddressByteSize();
3193 }
3194 
3195 
3196 bool
3197 Process::ShouldBroadcastEvent (Event *event_ptr)
3198 {
3199     const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr);
3200     bool return_value = true;
3201     LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
3202 
3203     switch (state)
3204     {
3205         case eStateConnected:
3206         case eStateAttaching:
3207         case eStateLaunching:
3208         case eStateDetached:
3209         case eStateExited:
3210         case eStateUnloaded:
3211             // These events indicate changes in the state of the debugging session, always report them.
3212             return_value = true;
3213             break;
3214         case eStateInvalid:
3215             // We stopped for no apparent reason, don't report it.
3216             return_value = false;
3217             break;
3218         case eStateRunning:
3219         case eStateStepping:
3220             // If we've started the target running, we handle the cases where we
3221             // are already running and where there is a transition from stopped to
3222             // running differently.
3223             // running -> running: Automatically suppress extra running events
3224             // stopped -> running: Report except when there is one or more no votes
3225             //     and no yes votes.
3226             SynchronouslyNotifyStateChanged (state);
3227             switch (m_public_state.GetValue())
3228             {
3229                 case eStateRunning:
3230                 case eStateStepping:
3231                     // We always suppress multiple runnings with no PUBLIC stop in between.
3232                     return_value = false;
3233                     break;
3234                 default:
3235                     // TODO: make this work correctly. For now always report
3236                     // run if we aren't running so we don't miss any runnning
3237                     // events. If I run the lldb/test/thread/a.out file and
3238                     // break at main.cpp:58, run and hit the breakpoints on
3239                     // multiple threads, then somehow during the stepping over
3240                     // of all breakpoints no run gets reported.
3241 
3242                     // This is a transition from stop to run.
3243                     switch (m_thread_list.ShouldReportRun (event_ptr))
3244                     {
3245                         default:
3246                         case eVoteYes:
3247                         case eVoteNoOpinion:
3248                             return_value = true;
3249                             break;
3250                         case eVoteNo:
3251                             return_value = false;
3252                             break;
3253                     }
3254                     break;
3255             }
3256             break;
3257         case eStateStopped:
3258         case eStateCrashed:
3259         case eStateSuspended:
3260         {
3261             // We've stopped.  First see if we're going to restart the target.
3262             // If we are going to stop, then we always broadcast the event.
3263             // If we aren't going to stop, let the thread plans decide if we're going to report this event.
3264             // If no thread has an opinion, we don't report it.
3265 
3266             RefreshStateAfterStop ();
3267             if (ProcessEventData::GetInterruptedFromEvent (event_ptr))
3268             {
3269                 if (log)
3270                     log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", event_ptr, StateAsCString(state));
3271                 return true;
3272             }
3273             else
3274             {
3275 
3276                 if (m_thread_list.ShouldStop (event_ptr) == false)
3277                 {
3278                     switch (m_thread_list.ShouldReportStop (event_ptr))
3279                     {
3280                         case eVoteYes:
3281                             Process::ProcessEventData::SetRestartedInEvent (event_ptr, true);
3282                             // Intentional fall-through here.
3283                         case eVoteNoOpinion:
3284                         case eVoteNo:
3285                             return_value = false;
3286                             break;
3287                     }
3288 
3289                     if (log)
3290                         log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state));
3291                     PrivateResume ();
3292                 }
3293                 else
3294                 {
3295                     return_value = true;
3296                     SynchronouslyNotifyStateChanged (state);
3297                 }
3298             }
3299         }
3300     }
3301 
3302     if (log)
3303         log->Printf ("Process::ShouldBroadcastEvent (%p) => %s - %s", event_ptr, StateAsCString(state), return_value ? "YES" : "NO");
3304     return return_value;
3305 }
3306 
3307 
3308 bool
3309 Process::StartPrivateStateThread (bool force)
3310 {
3311     LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
3312 
3313     bool already_running = PrivateStateThreadIsValid ();
3314     if (log)
3315         log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread");
3316 
3317     if (!force && already_running)
3318         return true;
3319 
3320     // Create a thread that watches our internal state and controls which
3321     // events make it to clients (into the DCProcess event queue).
3322     char thread_name[1024];
3323     if (already_running)
3324         snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state-override(pid=%llu)>", GetID());
3325     else
3326         snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%llu)>", GetID());
3327 
3328     // Create the private state thread, and start it running.
3329     m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL);
3330     bool success = IS_VALID_LLDB_HOST_THREAD(m_private_state_thread);
3331     if (success)
3332     {
3333         ResumePrivateStateThread();
3334         return true;
3335     }
3336     else
3337         return false;
3338 }
3339 
3340 void
3341 Process::PausePrivateStateThread ()
3342 {
3343     ControlPrivateStateThread (eBroadcastInternalStateControlPause);
3344 }
3345 
3346 void
3347 Process::ResumePrivateStateThread ()
3348 {
3349     ControlPrivateStateThread (eBroadcastInternalStateControlResume);
3350 }
3351 
3352 void
3353 Process::StopPrivateStateThread ()
3354 {
3355     if (PrivateStateThreadIsValid ())
3356         ControlPrivateStateThread (eBroadcastInternalStateControlStop);
3357     else
3358     {
3359         LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
3360         if (log)
3361             printf ("Went to stop the private state thread, but it was already invalid.");
3362     }
3363 }
3364 
3365 void
3366 Process::ControlPrivateStateThread (uint32_t signal)
3367 {
3368     LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
3369 
3370     assert (signal == eBroadcastInternalStateControlStop ||
3371             signal == eBroadcastInternalStateControlPause ||
3372             signal == eBroadcastInternalStateControlResume);
3373 
3374     if (log)
3375         log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal);
3376 
3377     // Signal the private state thread. First we should copy this is case the
3378     // thread starts exiting since the private state thread will NULL this out
3379     // when it exits
3380     const lldb::thread_t private_state_thread = m_private_state_thread;
3381     if (IS_VALID_LLDB_HOST_THREAD(private_state_thread))
3382     {
3383         TimeValue timeout_time;
3384         bool timed_out;
3385 
3386         m_private_state_control_broadcaster.BroadcastEvent (signal, NULL);
3387 
3388         timeout_time = TimeValue::Now();
3389         timeout_time.OffsetWithSeconds(2);
3390         if (log)
3391             log->Printf ("Sending control event of type: %d.", signal);
3392         m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out);
3393         m_private_state_control_wait.SetValue (false, eBroadcastNever);
3394 
3395         if (signal == eBroadcastInternalStateControlStop)
3396         {
3397             if (timed_out)
3398             {
3399                 Error error;
3400                 Host::ThreadCancel (private_state_thread, &error);
3401                 if (log)
3402                     log->Printf ("Timed out responding to the control event, cancel got error: \"%s\".", error.AsCString());
3403             }
3404             else
3405             {
3406                 if (log)
3407                     log->Printf ("The control event killed the private state thread without having to cancel.");
3408             }
3409 
3410             thread_result_t result = NULL;
3411             Host::ThreadJoin (private_state_thread, &result, NULL);
3412             m_private_state_thread = LLDB_INVALID_HOST_THREAD;
3413         }
3414     }
3415     else
3416     {
3417         if (log)
3418             log->Printf ("Private state thread already dead, no need to signal it to stop.");
3419     }
3420 }
3421 
3422 void
3423 Process::SendAsyncInterrupt ()
3424 {
3425     if (PrivateStateThreadIsValid())
3426         m_private_state_broadcaster.BroadcastEvent (Process::eBroadcastBitInterrupt, NULL);
3427     else
3428         BroadcastEvent (Process::eBroadcastBitInterrupt, NULL);
3429 }
3430 
3431 void
3432 Process::HandlePrivateEvent (EventSP &event_sp)
3433 {
3434     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3435     m_currently_handling_event.SetValue(true, eBroadcastNever);
3436 
3437     const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
3438 
3439     // First check to see if anybody wants a shot at this event:
3440     if (m_next_event_action_ap.get() != NULL)
3441     {
3442         NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp);
3443         switch (action_result)
3444         {
3445             case NextEventAction::eEventActionSuccess:
3446                 SetNextEventAction(NULL);
3447                 break;
3448 
3449             case NextEventAction::eEventActionRetry:
3450                 break;
3451 
3452             case NextEventAction::eEventActionExit:
3453                 // Handle Exiting Here.  If we already got an exited event,
3454                 // we should just propagate it.  Otherwise, swallow this event,
3455                 // and set our state to exit so the next event will kill us.
3456                 if (new_state != eStateExited)
3457                 {
3458                     // FIXME: should cons up an exited event, and discard this one.
3459                     SetExitStatus(0, m_next_event_action_ap->GetExitString());
3460                     SetNextEventAction(NULL);
3461                     return;
3462                 }
3463                 SetNextEventAction(NULL);
3464                 break;
3465         }
3466     }
3467 
3468     // See if we should broadcast this state to external clients?
3469     const bool should_broadcast = ShouldBroadcastEvent (event_sp.get());
3470 
3471     if (should_broadcast)
3472     {
3473         if (log)
3474         {
3475             log->Printf ("Process::%s (pid = %llu) broadcasting new state %s (old state %s) to %s",
3476                          __FUNCTION__,
3477                          GetID(),
3478                          StateAsCString(new_state),
3479                          StateAsCString (GetState ()),
3480                          IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public");
3481         }
3482         Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get());
3483         if (StateIsRunningState (new_state))
3484             PushProcessInputReader ();
3485         else
3486             PopProcessInputReader ();
3487 
3488         BroadcastEvent (event_sp);
3489     }
3490     else
3491     {
3492         if (log)
3493         {
3494             log->Printf ("Process::%s (pid = %llu) suppressing state %s (old state %s): should_broadcast == false",
3495                          __FUNCTION__,
3496                          GetID(),
3497                          StateAsCString(new_state),
3498                          StateAsCString (GetState ()));
3499         }
3500     }
3501     m_currently_handling_event.SetValue(false, eBroadcastAlways);
3502 }
3503 
3504 void *
3505 Process::PrivateStateThread (void *arg)
3506 {
3507     Process *proc = static_cast<Process*> (arg);
3508     void *result = proc->RunPrivateStateThread ();
3509     return result;
3510 }
3511 
3512 void *
3513 Process::RunPrivateStateThread ()
3514 {
3515     bool control_only = true;
3516     m_private_state_control_wait.SetValue (false, eBroadcastNever);
3517 
3518     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3519     if (log)
3520         log->Printf ("Process::%s (arg = %p, pid = %llu) thread starting...", __FUNCTION__, this, GetID());
3521 
3522     bool exit_now = false;
3523     while (!exit_now)
3524     {
3525         EventSP event_sp;
3526         WaitForEventsPrivate (NULL, event_sp, control_only);
3527         if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster))
3528         {
3529             if (log)
3530                 log->Printf ("Process::%s (arg = %p, pid = %llu) got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType());
3531 
3532             switch (event_sp->GetType())
3533             {
3534             case eBroadcastInternalStateControlStop:
3535                 exit_now = true;
3536                 break;      // doing any internal state managment below
3537 
3538             case eBroadcastInternalStateControlPause:
3539                 control_only = true;
3540                 break;
3541 
3542             case eBroadcastInternalStateControlResume:
3543                 control_only = false;
3544                 break;
3545             }
3546 
3547             m_private_state_control_wait.SetValue (true, eBroadcastAlways);
3548             continue;
3549         }
3550         else if (event_sp->GetType() == eBroadcastBitInterrupt)
3551         {
3552             if (m_public_state.GetValue() == eStateAttaching)
3553             {
3554                 if (log)
3555                     log->Printf ("Process::%s (arg = %p, pid = %llu) woke up with an interrupt while attaching - forwarding interrupt.", __FUNCTION__, this, GetID());
3556                 BroadcastEvent (eBroadcastBitInterrupt, NULL);
3557             }
3558             else
3559             {
3560                 if (log)
3561                     log->Printf ("Process::%s (arg = %p, pid = %llu) woke up with an interrupt - Halting.", __FUNCTION__, this, GetID());
3562                 Halt();
3563             }
3564             continue;
3565         }
3566 
3567         const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
3568 
3569         if (internal_state != eStateInvalid)
3570         {
3571             HandlePrivateEvent (event_sp);
3572         }
3573 
3574         if (internal_state == eStateInvalid ||
3575             internal_state == eStateExited  ||
3576             internal_state == eStateDetached )
3577         {
3578             if (log)
3579                 log->Printf ("Process::%s (arg = %p, pid = %llu) about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state));
3580 
3581             break;
3582         }
3583     }
3584 
3585     // Verify log is still enabled before attempting to write to it...
3586     if (log)
3587         log->Printf ("Process::%s (arg = %p, pid = %llu) thread exiting...", __FUNCTION__, this, GetID());
3588 
3589     m_private_state_control_wait.SetValue (true, eBroadcastAlways);
3590     m_private_state_thread = LLDB_INVALID_HOST_THREAD;
3591     return NULL;
3592 }
3593 
3594 //------------------------------------------------------------------
3595 // Process Event Data
3596 //------------------------------------------------------------------
3597 
3598 Process::ProcessEventData::ProcessEventData () :
3599     EventData (),
3600     m_process_sp (),
3601     m_state (eStateInvalid),
3602     m_restarted (false),
3603     m_update_state (0),
3604     m_interrupted (false)
3605 {
3606 }
3607 
3608 Process::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) :
3609     EventData (),
3610     m_process_sp (process_sp),
3611     m_state (state),
3612     m_restarted (false),
3613     m_update_state (0),
3614     m_interrupted (false)
3615 {
3616 }
3617 
3618 Process::ProcessEventData::~ProcessEventData()
3619 {
3620 }
3621 
3622 const ConstString &
3623 Process::ProcessEventData::GetFlavorString ()
3624 {
3625     static ConstString g_flavor ("Process::ProcessEventData");
3626     return g_flavor;
3627 }
3628 
3629 const ConstString &
3630 Process::ProcessEventData::GetFlavor () const
3631 {
3632     return ProcessEventData::GetFlavorString ();
3633 }
3634 
3635 void
3636 Process::ProcessEventData::DoOnRemoval (Event *event_ptr)
3637 {
3638     // This function gets called twice for each event, once when the event gets pulled
3639     // off of the private process event queue, and then any number of times, first when it gets pulled off of
3640     // the public event queue, then other times when we're pretending that this is where we stopped at the
3641     // end of expression evaluation.  m_update_state is used to distinguish these
3642     // three cases; it is 0 when we're just pulling it off for private handling,
3643     // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then.
3644 
3645     if (m_update_state != 1)
3646         return;
3647 
3648     m_process_sp->SetPublicState (m_state);
3649 
3650     // If we're stopped and haven't restarted, then do the breakpoint commands here:
3651     if (m_state == eStateStopped && ! m_restarted)
3652     {
3653         ThreadList &curr_thread_list = m_process_sp->GetThreadList();
3654         uint32_t num_threads = curr_thread_list.GetSize();
3655         uint32_t idx;
3656 
3657         // The actions might change one of the thread's stop_info's opinions about whether we should
3658         // stop the process, so we need to query that as we go.
3659 
3660         // One other complication here, is that we try to catch any case where the target has run (except for expressions)
3661         // and immediately exit, but if we get that wrong (which is possible) then the thread list might have changed, and
3662         // that would cause our iteration here to crash.  We could make a copy of the thread list, but we'd really like
3663         // to also know if it has changed at all, so we make up a vector of the thread ID's and check what we get back
3664         // against this list & bag out if anything differs.
3665         std::vector<uint32_t> thread_index_array(num_threads);
3666         for (idx = 0; idx < num_threads; ++idx)
3667             thread_index_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetIndexID();
3668 
3669         bool still_should_stop = true;
3670 
3671         for (idx = 0; idx < num_threads; ++idx)
3672         {
3673             curr_thread_list = m_process_sp->GetThreadList();
3674             if (curr_thread_list.GetSize() != num_threads)
3675             {
3676                 lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
3677                 if (log)
3678                     log->Printf("Number of threads changed from %u to %u while processing event.", num_threads, curr_thread_list.GetSize());
3679                 break;
3680             }
3681 
3682             lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx);
3683 
3684             if (thread_sp->GetIndexID() != thread_index_array[idx])
3685             {
3686                 lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
3687                 if (log)
3688                     log->Printf("The thread at position %u changed from %u to %u while processing event.",
3689                                 idx,
3690                                 thread_index_array[idx],
3691                                 thread_sp->GetIndexID());
3692                 break;
3693             }
3694 
3695             StopInfoSP stop_info_sp = thread_sp->GetStopInfo ();
3696             if (stop_info_sp)
3697             {
3698                 stop_info_sp->PerformAction(event_ptr);
3699                 // The stop action might restart the target.  If it does, then we want to mark that in the
3700                 // event so that whoever is receiving it will know to wait for the running event and reflect
3701                 // that state appropriately.
3702                 // We also need to stop processing actions, since they aren't expecting the target to be running.
3703 
3704                 // FIXME: we might have run.
3705                 if (stop_info_sp->HasTargetRunSinceMe())
3706                 {
3707                     SetRestarted (true);
3708                     break;
3709                 }
3710                 else if (!stop_info_sp->ShouldStop(event_ptr))
3711                 {
3712                     still_should_stop = false;
3713                 }
3714             }
3715         }
3716 
3717 
3718         if (m_process_sp->GetPrivateState() != eStateRunning)
3719         {
3720             if (!still_should_stop)
3721             {
3722                 // We've been asked to continue, so do that here.
3723                 SetRestarted(true);
3724                 // Use the public resume method here, since this is just
3725                 // extending a public resume.
3726                 m_process_sp->Resume();
3727             }
3728             else
3729             {
3730                 // If we didn't restart, run the Stop Hooks here:
3731                 // They might also restart the target, so watch for that.
3732                 m_process_sp->GetTarget().RunStopHooks();
3733                 if (m_process_sp->GetPrivateState() == eStateRunning)
3734                     SetRestarted(true);
3735             }
3736         }
3737 
3738     }
3739 }
3740 
3741 void
3742 Process::ProcessEventData::Dump (Stream *s) const
3743 {
3744     if (m_process_sp)
3745         s->Printf(" process = %p (pid = %llu), ", m_process_sp.get(), m_process_sp->GetID());
3746 
3747     s->Printf("state = %s", StateAsCString(GetState()));
3748 }
3749 
3750 const Process::ProcessEventData *
3751 Process::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr)
3752 {
3753     if (event_ptr)
3754     {
3755         const EventData *event_data = event_ptr->GetData();
3756         if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString())
3757             return static_cast <const ProcessEventData *> (event_ptr->GetData());
3758     }
3759     return NULL;
3760 }
3761 
3762 ProcessSP
3763 Process::ProcessEventData::GetProcessFromEvent (const Event *event_ptr)
3764 {
3765     ProcessSP process_sp;
3766     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
3767     if (data)
3768         process_sp = data->GetProcessSP();
3769     return process_sp;
3770 }
3771 
3772 StateType
3773 Process::ProcessEventData::GetStateFromEvent (const Event *event_ptr)
3774 {
3775     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
3776     if (data == NULL)
3777         return eStateInvalid;
3778     else
3779         return data->GetState();
3780 }
3781 
3782 bool
3783 Process::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr)
3784 {
3785     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
3786     if (data == NULL)
3787         return false;
3788     else
3789         return data->GetRestarted();
3790 }
3791 
3792 void
3793 Process::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value)
3794 {
3795     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
3796     if (data != NULL)
3797         data->SetRestarted(new_value);
3798 }
3799 
3800 bool
3801 Process::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr)
3802 {
3803     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
3804     if (data == NULL)
3805         return false;
3806     else
3807         return data->GetInterrupted ();
3808 }
3809 
3810 void
3811 Process::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value)
3812 {
3813     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
3814     if (data != NULL)
3815         data->SetInterrupted(new_value);
3816 }
3817 
3818 bool
3819 Process::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr)
3820 {
3821     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
3822     if (data)
3823     {
3824         data->SetUpdateStateOnRemoval();
3825         return true;
3826     }
3827     return false;
3828 }
3829 
3830 lldb::TargetSP
3831 Process::CalculateTarget ()
3832 {
3833     return m_target.shared_from_this();
3834 }
3835 
3836 void
3837 Process::CalculateExecutionContext (ExecutionContext &exe_ctx)
3838 {
3839     exe_ctx.SetTargetPtr (&m_target);
3840     exe_ctx.SetProcessPtr (this);
3841     exe_ctx.SetThreadPtr(NULL);
3842     exe_ctx.SetFramePtr (NULL);
3843 }
3844 
3845 //uint32_t
3846 //Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
3847 //{
3848 //    return 0;
3849 //}
3850 //
3851 //ArchSpec
3852 //Process::GetArchSpecForExistingProcess (lldb::pid_t pid)
3853 //{
3854 //    return Host::GetArchSpecForExistingProcess (pid);
3855 //}
3856 //
3857 //ArchSpec
3858 //Process::GetArchSpecForExistingProcess (const char *process_name)
3859 //{
3860 //    return Host::GetArchSpecForExistingProcess (process_name);
3861 //}
3862 //
3863 void
3864 Process::AppendSTDOUT (const char * s, size_t len)
3865 {
3866     Mutex::Locker locker (m_stdio_communication_mutex);
3867     m_stdout_data.append (s, len);
3868     BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (GetTarget().GetProcessSP(), GetState()));
3869 }
3870 
3871 void
3872 Process::AppendSTDERR (const char * s, size_t len)
3873 {
3874     Mutex::Locker locker (m_stdio_communication_mutex);
3875     m_stderr_data.append (s, len);
3876     BroadcastEventIfUnique (eBroadcastBitSTDERR, new ProcessEventData (GetTarget().GetProcessSP(), GetState()));
3877 }
3878 
3879 //------------------------------------------------------------------
3880 // Process STDIO
3881 //------------------------------------------------------------------
3882 
3883 size_t
3884 Process::GetSTDOUT (char *buf, size_t buf_size, Error &error)
3885 {
3886     Mutex::Locker locker(m_stdio_communication_mutex);
3887     size_t bytes_available = m_stdout_data.size();
3888     if (bytes_available > 0)
3889     {
3890         LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3891         if (log)
3892             log->Printf ("Process::GetSTDOUT (buf = %p, size = %zu)", buf, buf_size);
3893         if (bytes_available > buf_size)
3894         {
3895             memcpy(buf, m_stdout_data.c_str(), buf_size);
3896             m_stdout_data.erase(0, buf_size);
3897             bytes_available = buf_size;
3898         }
3899         else
3900         {
3901             memcpy(buf, m_stdout_data.c_str(), bytes_available);
3902             m_stdout_data.clear();
3903         }
3904     }
3905     return bytes_available;
3906 }
3907 
3908 
3909 size_t
3910 Process::GetSTDERR (char *buf, size_t buf_size, Error &error)
3911 {
3912     Mutex::Locker locker(m_stdio_communication_mutex);
3913     size_t bytes_available = m_stderr_data.size();
3914     if (bytes_available > 0)
3915     {
3916         LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3917         if (log)
3918             log->Printf ("Process::GetSTDERR (buf = %p, size = %zu)", buf, buf_size);
3919         if (bytes_available > buf_size)
3920         {
3921             memcpy(buf, m_stderr_data.c_str(), buf_size);
3922             m_stderr_data.erase(0, buf_size);
3923             bytes_available = buf_size;
3924         }
3925         else
3926         {
3927             memcpy(buf, m_stderr_data.c_str(), bytes_available);
3928             m_stderr_data.clear();
3929         }
3930     }
3931     return bytes_available;
3932 }
3933 
3934 void
3935 Process::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len)
3936 {
3937     Process *process = (Process *) baton;
3938     process->AppendSTDOUT (static_cast<const char *>(src), src_len);
3939 }
3940 
3941 size_t
3942 Process::ProcessInputReaderCallback (void *baton,
3943                                      InputReader &reader,
3944                                      lldb::InputReaderAction notification,
3945                                      const char *bytes,
3946                                      size_t bytes_len)
3947 {
3948     Process *process = (Process *) baton;
3949 
3950     switch (notification)
3951     {
3952     case eInputReaderActivate:
3953         break;
3954 
3955     case eInputReaderDeactivate:
3956         break;
3957 
3958     case eInputReaderReactivate:
3959         break;
3960 
3961     case eInputReaderAsynchronousOutputWritten:
3962         break;
3963 
3964     case eInputReaderGotToken:
3965         {
3966             Error error;
3967             process->PutSTDIN (bytes, bytes_len, error);
3968         }
3969         break;
3970 
3971     case eInputReaderInterrupt:
3972         process->Halt ();
3973         break;
3974 
3975     case eInputReaderEndOfFile:
3976         process->AppendSTDOUT ("^D", 2);
3977         break;
3978 
3979     case eInputReaderDone:
3980         break;
3981 
3982     }
3983 
3984     return bytes_len;
3985 }
3986 
3987 void
3988 Process::ResetProcessInputReader ()
3989 {
3990     m_process_input_reader.reset();
3991 }
3992 
3993 void
3994 Process::SetSTDIOFileDescriptor (int file_descriptor)
3995 {
3996     // First set up the Read Thread for reading/handling process I/O
3997 
3998     std::auto_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true));
3999 
4000     if (conn_ap.get())
4001     {
4002         m_stdio_communication.SetConnection (conn_ap.release());
4003         if (m_stdio_communication.IsConnected())
4004         {
4005             m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this);
4006             m_stdio_communication.StartReadThread();
4007 
4008             // Now read thread is set up, set up input reader.
4009 
4010             if (!m_process_input_reader.get())
4011             {
4012                 m_process_input_reader.reset (new InputReader(m_target.GetDebugger()));
4013                 Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback,
4014                                                                this,
4015                                                                eInputReaderGranularityByte,
4016                                                                NULL,
4017                                                                NULL,
4018                                                                false));
4019 
4020                 if  (err.Fail())
4021                     m_process_input_reader.reset();
4022             }
4023         }
4024     }
4025 }
4026 
4027 void
4028 Process::PushProcessInputReader ()
4029 {
4030     if (m_process_input_reader && !m_process_input_reader->IsActive())
4031         m_target.GetDebugger().PushInputReader (m_process_input_reader);
4032 }
4033 
4034 void
4035 Process::PopProcessInputReader ()
4036 {
4037     if (m_process_input_reader && m_process_input_reader->IsActive())
4038         m_target.GetDebugger().PopInputReader (m_process_input_reader);
4039 }
4040 
4041 // The process needs to know about installed plug-ins
4042 void
4043 Process::SettingsInitialize ()
4044 {
4045 //    static std::vector<OptionEnumValueElement> g_plugins;
4046 //
4047 //    int i=0;
4048 //    const char *name;
4049 //    OptionEnumValueElement option_enum;
4050 //    while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL)
4051 //    {
4052 //        if (name)
4053 //        {
4054 //            option_enum.value = i;
4055 //            option_enum.string_value = name;
4056 //            option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i);
4057 //            g_plugins.push_back (option_enum);
4058 //        }
4059 //        ++i;
4060 //    }
4061 //    option_enum.value = 0;
4062 //    option_enum.string_value = NULL;
4063 //    option_enum.usage = NULL;
4064 //    g_plugins.push_back (option_enum);
4065 //
4066 //    for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i)
4067 //    {
4068 //        if (::strcmp (name, "plugin") == 0)
4069 //        {
4070 //            SettingsController::instance_settings_table[i].enum_values = &g_plugins[0];
4071 //            break;
4072 //        }
4073 //    }
4074 //
4075     Thread::SettingsInitialize ();
4076 }
4077 
4078 void
4079 Process::SettingsTerminate ()
4080 {
4081     Thread::SettingsTerminate ();
4082 }
4083 
4084 ExecutionResults
4085 Process::RunThreadPlan (ExecutionContext &exe_ctx,
4086                         lldb::ThreadPlanSP &thread_plan_sp,
4087                         bool stop_others,
4088                         bool try_all_threads,
4089                         bool discard_on_error,
4090                         uint32_t single_thread_timeout_usec,
4091                         Stream &errors)
4092 {
4093     ExecutionResults return_value = eExecutionSetupError;
4094 
4095     if (thread_plan_sp.get() == NULL)
4096     {
4097         errors.Printf("RunThreadPlan called with empty thread plan.");
4098         return eExecutionSetupError;
4099     }
4100 
4101     if (exe_ctx.GetProcessPtr() != this)
4102     {
4103         errors.Printf("RunThreadPlan called on wrong process.");
4104         return eExecutionSetupError;
4105     }
4106 
4107     Thread *thread = exe_ctx.GetThreadPtr();
4108     if (thread == NULL)
4109     {
4110         errors.Printf("RunThreadPlan called with invalid thread.");
4111         return eExecutionSetupError;
4112     }
4113 
4114     // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes.
4115     // For that to be true the plan can't be private - since private plans suppress themselves in the
4116     // GetCompletedPlan call.
4117 
4118     bool orig_plan_private = thread_plan_sp->GetPrivate();
4119     thread_plan_sp->SetPrivate(false);
4120 
4121     if (m_private_state.GetValue() != eStateStopped)
4122     {
4123         errors.Printf ("RunThreadPlan called while the private state was not stopped.");
4124         return eExecutionSetupError;
4125     }
4126 
4127     // Save the thread & frame from the exe_ctx for restoration after we run
4128     const uint32_t thread_idx_id = thread->GetIndexID();
4129     StackID ctx_frame_id = thread->GetSelectedFrame()->GetStackID();
4130 
4131     // N.B. Running the target may unset the currently selected thread and frame.  We don't want to do that either,
4132     // so we should arrange to reset them as well.
4133 
4134     lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread();
4135 
4136     uint32_t selected_tid;
4137     StackID selected_stack_id;
4138     if (selected_thread_sp)
4139     {
4140         selected_tid = selected_thread_sp->GetIndexID();
4141         selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID();
4142     }
4143     else
4144     {
4145         selected_tid = LLDB_INVALID_THREAD_ID;
4146     }
4147 
4148     lldb::thread_t backup_private_state_thread = LLDB_INVALID_HOST_THREAD;
4149     lldb::StateType old_state;
4150     lldb::ThreadPlanSP stopper_base_plan_sp;
4151 
4152     lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
4153     if (Host::GetCurrentThread() == m_private_state_thread)
4154     {
4155         // Yikes, we are running on the private state thread!  So we can't wait for public events on this thread, since
4156         // we are the thread that is generating public events.
4157         // The simplest thing to do is to spin up a temporary thread to handle private state thread events while
4158         // we are fielding public events here.
4159         if (log)
4160 			log->Printf ("Running thread plan on private state thread, spinning up another state thread to handle the events.");
4161 
4162 
4163         backup_private_state_thread = m_private_state_thread;
4164 
4165         // One other bit of business: we want to run just this thread plan and anything it pushes, and then stop,
4166         // returning control here.
4167         // But in the normal course of things, the plan above us on the stack would be given a shot at the stop
4168         // event before deciding to stop, and we don't want that.  So we insert a "stopper" base plan on the stack
4169         // before the plan we want to run.  Since base plans always stop and return control to the user, that will
4170         // do just what we want.
4171         stopper_base_plan_sp.reset(new ThreadPlanBase (*thread));
4172         thread->QueueThreadPlan (stopper_base_plan_sp, false);
4173         // Have to make sure our public state is stopped, since otherwise the reporting logic below doesn't work correctly.
4174         old_state = m_public_state.GetValue();
4175         m_public_state.SetValueNoLock(eStateStopped);
4176 
4177         // Now spin up the private state thread:
4178         StartPrivateStateThread(true);
4179     }
4180 
4181     thread->QueueThreadPlan(thread_plan_sp, false); // This used to pass "true" does that make sense?
4182 
4183     Listener listener("lldb.process.listener.run-thread-plan");
4184 
4185     lldb::EventSP event_to_broadcast_sp;
4186 
4187     {
4188         // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get
4189         // restored on exit to the function.
4190         //
4191         // If the event needs to propagate beyond the hijacker (e.g., the process exits during execution), then the event
4192         // is put into event_to_broadcast_sp for rebroadcasting.
4193 
4194         ProcessEventHijacker run_thread_plan_hijacker (*this, &listener);
4195 
4196         if (log)
4197         {
4198             StreamString s;
4199             thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
4200             log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4llx to run thread plan \"%s\".",
4201                          thread->GetIndexID(),
4202                          thread->GetID(),
4203                          s.GetData());
4204         }
4205 
4206         bool got_event;
4207         lldb::EventSP event_sp;
4208         lldb::StateType stop_state = lldb::eStateInvalid;
4209 
4210         TimeValue* timeout_ptr = NULL;
4211         TimeValue real_timeout;
4212 
4213         bool first_timeout = true;
4214         bool do_resume = true;
4215 
4216         while (1)
4217         {
4218             // We usually want to resume the process if we get to the top of the loop.
4219             // The only exception is if we get two running events with no intervening
4220             // stop, which can happen, we will just wait for then next stop event.
4221 
4222             if (do_resume)
4223             {
4224                 // Do the initial resume and wait for the running event before going further.
4225 
4226                 Error resume_error = PrivateResume ();
4227                 if (!resume_error.Success())
4228                 {
4229                     errors.Printf("Error resuming inferior: \"%s\".\n", resume_error.AsCString());
4230                     return_value = eExecutionSetupError;
4231                     break;
4232                 }
4233 
4234                 real_timeout = TimeValue::Now();
4235                 real_timeout.OffsetWithMicroSeconds(500000);
4236                 timeout_ptr = &real_timeout;
4237 
4238                 got_event = listener.WaitForEvent(timeout_ptr, event_sp);
4239                 if (!got_event)
4240                 {
4241                     if (log)
4242                         log->PutCString("Process::RunThreadPlan(): didn't get any event after initial resume, exiting.");
4243 
4244                     errors.Printf("Didn't get any event after initial resume, exiting.");
4245                     return_value = eExecutionSetupError;
4246                     break;
4247                 }
4248 
4249                 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4250                 if (stop_state != eStateRunning)
4251                 {
4252                     if (log)
4253                         log->Printf("Process::RunThreadPlan(): didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state));
4254 
4255                     errors.Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state));
4256                     return_value = eExecutionSetupError;
4257                     break;
4258                 }
4259 
4260                 if (log)
4261                     log->PutCString ("Process::RunThreadPlan(): resuming succeeded.");
4262                 // We need to call the function synchronously, so spin waiting for it to return.
4263                 // If we get interrupted while executing, we're going to lose our context, and
4264                 // won't be able to gather the result at this point.
4265                 // We set the timeout AFTER the resume, since the resume takes some time and we
4266                 // don't want to charge that to the timeout.
4267 
4268                 if (single_thread_timeout_usec != 0)
4269                 {
4270                     // we have a > 0 timeout, let us set it so that we stop after the deadline
4271                     real_timeout = TimeValue::Now();
4272                     real_timeout.OffsetWithMicroSeconds(single_thread_timeout_usec);
4273 
4274                     timeout_ptr = &real_timeout;
4275                 }
4276                 else if (first_timeout)
4277                 {
4278                     // if we are willing to wait "forever" we still need to have an initial timeout
4279                     // this timeout is going to induce all threads to run when hit. we do this so that
4280                     // we can avoid ending locked up because of multithreaded contention issues
4281                     real_timeout = TimeValue::Now();
4282                     real_timeout.OffsetWithNanoSeconds(500000000UL);
4283                     timeout_ptr = &real_timeout;
4284                 }
4285                 else
4286                 {
4287                     timeout_ptr = NULL; // if we are in a no-timeout scenario, then we only need a fake timeout the first time through
4288                     // at this point in the code, all threads will be running so we are willing to wait forever, and do not
4289                     // need a timeout
4290                 }
4291             }
4292             else
4293             {
4294                 if (log)
4295                     log->PutCString ("Process::RunThreadPlan(): handled an extra running event.");
4296                 do_resume = true;
4297             }
4298 
4299             // Now wait for the process to stop again:
4300             event_sp.reset();
4301 
4302             if (log)
4303             {
4304                 if (timeout_ptr)
4305                 {
4306                     StreamString s;
4307                     s.Printf ("about to wait - timeout is:\n   ");
4308                     timeout_ptr->Dump (&s, 120);
4309                     s.Printf ("\nNow is:\n    ");
4310                     TimeValue::Now().Dump (&s, 120);
4311                     log->Printf ("Process::RunThreadPlan(): %s", s.GetData());
4312                 }
4313                 else
4314                 {
4315                     log->Printf ("Process::RunThreadPlan(): about to wait forever.");
4316                 }
4317             }
4318 
4319             got_event = listener.WaitForEvent (timeout_ptr, event_sp);
4320 
4321             if (got_event)
4322             {
4323                 if (event_sp.get())
4324                 {
4325                     bool keep_going = false;
4326                     if (event_sp->GetType() == eBroadcastBitInterrupt)
4327                     {
4328                         Halt();
4329                         keep_going = false;
4330                         return_value = eExecutionInterrupted;
4331                         errors.Printf ("Execution halted by user interrupt.");
4332                         if (log)
4333                             log->Printf ("Process::RunThreadPlan(): Got  interrupted by eBroadcastBitInterrupted, exiting.");
4334                     }
4335                     else
4336                     {
4337                         stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4338                         if (log)
4339                             log->Printf("Process::RunThreadPlan(): in while loop, got event: %s.", StateAsCString(stop_state));
4340 
4341                         switch (stop_state)
4342                         {
4343                         case lldb::eStateStopped:
4344                             {
4345                                 // Yay, we're done.  Now make sure that our thread plan actually completed.
4346                                 ThreadSP thread_sp = GetThreadList().FindThreadByIndexID (thread_idx_id);
4347                                 if (!thread_sp)
4348                                 {
4349                                     // Ooh, our thread has vanished.  Unlikely that this was successful execution...
4350                                     if (log)
4351                                         log->Printf ("Process::RunThreadPlan(): execution completed but our thread (index-id=%u) has vanished.", thread_idx_id);
4352                                     return_value = eExecutionInterrupted;
4353                                 }
4354                                 else
4355                                 {
4356                                     StopInfoSP stop_info_sp (thread_sp->GetStopInfo ());
4357                                     StopReason stop_reason = eStopReasonInvalid;
4358                                     if (stop_info_sp)
4359                                          stop_reason = stop_info_sp->GetStopReason();
4360                                     if (stop_reason == eStopReasonPlanComplete)
4361                                     {
4362                                         if (log)
4363                                             log->PutCString ("Process::RunThreadPlan(): execution completed successfully.");
4364                                         // Now mark this plan as private so it doesn't get reported as the stop reason
4365                                         // after this point.
4366                                         if (thread_plan_sp)
4367                                             thread_plan_sp->SetPrivate (orig_plan_private);
4368                                         return_value = eExecutionCompleted;
4369                                     }
4370                                     else
4371                                     {
4372                                         if (log)
4373                                             log->PutCString ("Process::RunThreadPlan(): thread plan didn't successfully complete.");
4374 
4375                                         return_value = eExecutionInterrupted;
4376                                     }
4377                                 }
4378                             }
4379                             break;
4380 
4381                         case lldb::eStateCrashed:
4382                             if (log)
4383                                 log->PutCString ("Process::RunThreadPlan(): execution crashed.");
4384                             return_value = eExecutionInterrupted;
4385                             break;
4386 
4387                         case lldb::eStateRunning:
4388                             do_resume = false;
4389                             keep_going = true;
4390                             break;
4391 
4392                         default:
4393                             if (log)
4394                                 log->Printf("Process::RunThreadPlan(): execution stopped with unexpected state: %s.", StateAsCString(stop_state));
4395 
4396                             if (stop_state == eStateExited)
4397                                 event_to_broadcast_sp = event_sp;
4398 
4399                             errors.Printf ("Execution stopped with unexpected state.\n");
4400                             return_value = eExecutionInterrupted;
4401                             break;
4402                         }
4403                     }
4404 
4405                     if (keep_going)
4406                         continue;
4407                     else
4408                         break;
4409                 }
4410                 else
4411                 {
4412                     if (log)
4413                         log->PutCString ("Process::RunThreadPlan(): got_event was true, but the event pointer was null.  How odd...");
4414                     return_value = eExecutionInterrupted;
4415                     break;
4416                 }
4417             }
4418             else
4419             {
4420                 // If we didn't get an event that means we've timed out...
4421                 // We will interrupt the process here.  Depending on what we were asked to do we will
4422                 // either exit, or try with all threads running for the same timeout.
4423                 // Not really sure what to do if Halt fails here...
4424 
4425                 if (log) {
4426                     if (try_all_threads)
4427                     {
4428                         if (first_timeout)
4429                             log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, "
4430                                          "trying with all threads enabled.",
4431                                          single_thread_timeout_usec);
4432                         else
4433                             log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled "
4434                                          "and timeout: %d timed out.",
4435                                          single_thread_timeout_usec);
4436                     }
4437                     else
4438                         log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, "
4439                                      "halt and abandoning execution.",
4440                                      single_thread_timeout_usec);
4441                 }
4442 
4443                 Error halt_error = Halt();
4444                 if (halt_error.Success())
4445                 {
4446                     if (log)
4447                         log->PutCString ("Process::RunThreadPlan(): Halt succeeded.");
4448 
4449                     // If halt succeeds, it always produces a stopped event.  Wait for that:
4450 
4451                     real_timeout = TimeValue::Now();
4452                     real_timeout.OffsetWithMicroSeconds(500000);
4453 
4454                     got_event = listener.WaitForEvent(&real_timeout, event_sp);
4455 
4456                     if (got_event)
4457                     {
4458                         stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4459                         if (log)
4460                         {
4461                             log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state));
4462                             if (stop_state == lldb::eStateStopped
4463                                 && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get()))
4464                                 log->PutCString ("    Event was the Halt interruption event.");
4465                         }
4466 
4467                         if (stop_state == lldb::eStateStopped)
4468                         {
4469                             // Between the time we initiated the Halt and the time we delivered it, the process could have
4470                             // already finished its job.  Check that here:
4471 
4472                             if (thread->IsThreadPlanDone (thread_plan_sp.get()))
4473                             {
4474                                 if (log)
4475                                     log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done.  "
4476                                                  "Exiting wait loop.");
4477                                 return_value = eExecutionCompleted;
4478                                 break;
4479                             }
4480 
4481                             if (!try_all_threads)
4482                             {
4483                                 if (log)
4484                                     log->PutCString ("Process::RunThreadPlan(): try_all_threads was false, we stopped so now we're quitting.");
4485                                 return_value = eExecutionInterrupted;
4486                                 break;
4487                             }
4488 
4489                             if (first_timeout)
4490                             {
4491                                 // Set all the other threads to run, and return to the top of the loop, which will continue;
4492                                 first_timeout = false;
4493                                 thread_plan_sp->SetStopOthers (false);
4494                                 if (log)
4495                                     log->PutCString ("Process::RunThreadPlan(): about to resume.");
4496 
4497                                 continue;
4498                             }
4499                             else
4500                             {
4501                                 // Running all threads failed, so return Interrupted.
4502                                 if (log)
4503                                     log->PutCString("Process::RunThreadPlan(): running all threads timed out.");
4504                                 return_value = eExecutionInterrupted;
4505                                 break;
4506                             }
4507                         }
4508                     }
4509                     else
4510                     {   if (log)
4511                             log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event.  "
4512                                     "I'm getting out of here passing Interrupted.");
4513                         return_value = eExecutionInterrupted;
4514                         break;
4515                     }
4516                 }
4517                 else
4518                 {
4519                     // This branch is to work around some problems with gdb-remote's Halt.  It is a little racy, and can return
4520                     // an error from halt, but if you wait a bit you'll get a stopped event anyway.
4521                     if (log)
4522                         log->Printf ("Process::RunThreadPlan(): halt failed: error = \"%s\", I'm just going to wait a little longer and see if I get a stopped event.",
4523                                      halt_error.AsCString());
4524                     real_timeout = TimeValue::Now();
4525                     real_timeout.OffsetWithMicroSeconds(500000);
4526                     timeout_ptr = &real_timeout;
4527                     got_event = listener.WaitForEvent(&real_timeout, event_sp);
4528                     if (!got_event || event_sp.get() == NULL)
4529                     {
4530                         // This is not going anywhere, bag out.
4531                         if (log)
4532                             log->PutCString ("Process::RunThreadPlan(): halt failed: and waiting for the stopped event failed.");
4533                         return_value = eExecutionInterrupted;
4534                         break;
4535                     }
4536                     else
4537                     {
4538                         stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4539                         if (log)
4540                             log->PutCString ("Process::RunThreadPlan(): halt failed: but then I got a stopped event.  Whatever...");
4541                         if (stop_state == lldb::eStateStopped)
4542                         {
4543                             // Between the time we initiated the Halt and the time we delivered it, the process could have
4544                             // already finished its job.  Check that here:
4545 
4546                             if (thread->IsThreadPlanDone (thread_plan_sp.get()))
4547                             {
4548                                 if (log)
4549                                     log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done.  "
4550                                                  "Exiting wait loop.");
4551                                 return_value = eExecutionCompleted;
4552                                 break;
4553                             }
4554 
4555                             if (first_timeout)
4556                             {
4557                                 // Set all the other threads to run, and return to the top of the loop, which will continue;
4558                                 first_timeout = false;
4559                                 thread_plan_sp->SetStopOthers (false);
4560                                 if (log)
4561                                     log->PutCString ("Process::RunThreadPlan(): About to resume.");
4562 
4563                                 continue;
4564                             }
4565                             else
4566                             {
4567                                 // Running all threads failed, so return Interrupted.
4568                                 if (log)
4569                                     log->PutCString ("Process::RunThreadPlan(): running all threads timed out.");
4570                                 return_value = eExecutionInterrupted;
4571                                 break;
4572                             }
4573                         }
4574                         else
4575                         {
4576                             if (log)
4577                                 log->Printf ("Process::RunThreadPlan(): halt failed, I waited and didn't get"
4578                                              " a stopped event, instead got %s.", StateAsCString(stop_state));
4579                             return_value = eExecutionInterrupted;
4580                             break;
4581                         }
4582                     }
4583                 }
4584 
4585             }
4586 
4587         }  // END WAIT LOOP
4588 
4589         // If we had to start up a temporary private state thread to run this thread plan, shut it down now.
4590         if (IS_VALID_LLDB_HOST_THREAD(backup_private_state_thread))
4591         {
4592             StopPrivateStateThread();
4593             Error error;
4594             m_private_state_thread = backup_private_state_thread;
4595             if (stopper_base_plan_sp)
4596             {
4597                 thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp);
4598             }
4599             m_public_state.SetValueNoLock(old_state);
4600 
4601         }
4602 
4603 
4604         // Now do some processing on the results of the run:
4605         if (return_value == eExecutionInterrupted)
4606         {
4607             if (log)
4608             {
4609                 StreamString s;
4610                 if (event_sp)
4611                     event_sp->Dump (&s);
4612                 else
4613                 {
4614                     log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL.");
4615                 }
4616 
4617                 StreamString ts;
4618 
4619                 const char *event_explanation = NULL;
4620 
4621                 do
4622                 {
4623                     if (!event_sp)
4624                     {
4625                         event_explanation = "<no event>";
4626                         break;
4627                     }
4628                     else if (event_sp->GetType() == eBroadcastBitInterrupt)
4629                     {
4630                         event_explanation = "<user interrupt>";
4631                         break;
4632                     }
4633                     else
4634                     {
4635                         const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get());
4636 
4637                         if (!event_data)
4638                         {
4639                             event_explanation = "<no event data>";
4640                             break;
4641                         }
4642 
4643                         Process *process = event_data->GetProcessSP().get();
4644 
4645                         if (!process)
4646                         {
4647                             event_explanation = "<no process>";
4648                             break;
4649                         }
4650 
4651                         ThreadList &thread_list = process->GetThreadList();
4652 
4653                         uint32_t num_threads = thread_list.GetSize();
4654                         uint32_t thread_index;
4655 
4656                         ts.Printf("<%u threads> ", num_threads);
4657 
4658                         for (thread_index = 0;
4659                              thread_index < num_threads;
4660                              ++thread_index)
4661                         {
4662                             Thread *thread = thread_list.GetThreadAtIndex(thread_index).get();
4663 
4664                             if (!thread)
4665                             {
4666                                 ts.Printf("<?> ");
4667                                 continue;
4668                             }
4669 
4670                             ts.Printf("<0x%4.4llx ", thread->GetID());
4671                             RegisterContext *register_context = thread->GetRegisterContext().get();
4672 
4673                             if (register_context)
4674                                 ts.Printf("[ip 0x%llx] ", register_context->GetPC());
4675                             else
4676                                 ts.Printf("[ip unknown] ");
4677 
4678                             lldb::StopInfoSP stop_info_sp = thread->GetStopInfo();
4679                             if (stop_info_sp)
4680                             {
4681                                 const char *stop_desc = stop_info_sp->GetDescription();
4682                                 if (stop_desc)
4683                                     ts.PutCString (stop_desc);
4684                             }
4685                             ts.Printf(">");
4686                         }
4687 
4688                         event_explanation = ts.GetData();
4689                     }
4690                 } while (0);
4691 
4692                 if (event_explanation)
4693                     log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation);
4694                 else
4695                     log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData());
4696             }
4697 
4698             if (discard_on_error && thread_plan_sp)
4699             {
4700                 if (log)
4701                     log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - discarding thread plans up to %p.", thread_plan_sp.get());
4702                 thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
4703                 thread_plan_sp->SetPrivate (orig_plan_private);
4704             }
4705             else
4706             {
4707                 if (log)
4708                     log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - for plan: %p not discarding.", thread_plan_sp.get());
4709             }
4710         }
4711         else if (return_value == eExecutionSetupError)
4712         {
4713             if (log)
4714                 log->PutCString("Process::RunThreadPlan(): execution set up error.");
4715 
4716             if (discard_on_error && thread_plan_sp)
4717             {
4718                 thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
4719                 thread_plan_sp->SetPrivate (orig_plan_private);
4720             }
4721         }
4722         else
4723         {
4724             if (thread->IsThreadPlanDone (thread_plan_sp.get()))
4725             {
4726                 if (log)
4727                     log->PutCString("Process::RunThreadPlan(): thread plan is done");
4728                 return_value = eExecutionCompleted;
4729             }
4730             else if (thread->WasThreadPlanDiscarded (thread_plan_sp.get()))
4731             {
4732                 if (log)
4733                     log->PutCString("Process::RunThreadPlan(): thread plan was discarded");
4734                 return_value = eExecutionDiscarded;
4735             }
4736             else
4737             {
4738                 if (log)
4739                     log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course");
4740                 if (discard_on_error && thread_plan_sp)
4741                 {
4742                     if (log)
4743                         log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause discard_on_error is set.");
4744                     thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
4745                     thread_plan_sp->SetPrivate (orig_plan_private);
4746                 }
4747             }
4748         }
4749 
4750         // Thread we ran the function in may have gone away because we ran the target
4751         // Check that it's still there, and if it is put it back in the context.  Also restore the
4752         // frame in the context if it is still present.
4753         thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get();
4754         if (thread)
4755         {
4756             exe_ctx.SetFrameSP (thread->GetFrameWithStackID (ctx_frame_id));
4757         }
4758 
4759         // Also restore the current process'es selected frame & thread, since this function calling may
4760         // be done behind the user's back.
4761 
4762         if (selected_tid != LLDB_INVALID_THREAD_ID)
4763         {
4764             if (GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid())
4765             {
4766                 // We were able to restore the selected thread, now restore the frame:
4767                 StackFrameSP old_frame_sp = GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id);
4768                 if (old_frame_sp)
4769                     GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get());
4770             }
4771         }
4772     }
4773 
4774     // If the process exited during the run of the thread plan, notify everyone.
4775 
4776     if (event_to_broadcast_sp)
4777     {
4778         if (log)
4779             log->PutCString("Process::RunThreadPlan(): rebroadcasting event.");
4780         BroadcastEvent(event_to_broadcast_sp);
4781     }
4782 
4783     return return_value;
4784 }
4785 
4786 const char *
4787 Process::ExecutionResultAsCString (ExecutionResults result)
4788 {
4789     const char *result_name;
4790 
4791     switch (result)
4792     {
4793         case eExecutionCompleted:
4794             result_name = "eExecutionCompleted";
4795             break;
4796         case eExecutionDiscarded:
4797             result_name = "eExecutionDiscarded";
4798             break;
4799         case eExecutionInterrupted:
4800             result_name = "eExecutionInterrupted";
4801             break;
4802         case eExecutionSetupError:
4803             result_name = "eExecutionSetupError";
4804             break;
4805         case eExecutionTimedOut:
4806             result_name = "eExecutionTimedOut";
4807             break;
4808     }
4809     return result_name;
4810 }
4811 
4812 void
4813 Process::GetStatus (Stream &strm)
4814 {
4815     const StateType state = GetState();
4816     if (StateIsStoppedState(state, false))
4817     {
4818         if (state == eStateExited)
4819         {
4820             int exit_status = GetExitStatus();
4821             const char *exit_description = GetExitDescription();
4822             strm.Printf ("Process %llu exited with status = %i (0x%8.8x) %s\n",
4823                           GetID(),
4824                           exit_status,
4825                           exit_status,
4826                           exit_description ? exit_description : "");
4827         }
4828         else
4829         {
4830             if (state == eStateConnected)
4831                 strm.Printf ("Connected to remote target.\n");
4832             else
4833                 strm.Printf ("Process %llu %s\n", GetID(), StateAsCString (state));
4834         }
4835     }
4836     else
4837     {
4838         strm.Printf ("Process %llu is running.\n", GetID());
4839     }
4840 }
4841 
4842 size_t
4843 Process::GetThreadStatus (Stream &strm,
4844                           bool only_threads_with_stop_reason,
4845                           uint32_t start_frame,
4846                           uint32_t num_frames,
4847                           uint32_t num_frames_with_source)
4848 {
4849     size_t num_thread_infos_dumped = 0;
4850 
4851     const size_t num_threads = GetThreadList().GetSize();
4852     for (uint32_t i = 0; i < num_threads; i++)
4853     {
4854         Thread *thread = GetThreadList().GetThreadAtIndex(i).get();
4855         if (thread)
4856         {
4857             if (only_threads_with_stop_reason)
4858             {
4859                 if (thread->GetStopInfo().get() == NULL)
4860                     continue;
4861             }
4862             thread->GetStatus (strm,
4863                                start_frame,
4864                                num_frames,
4865                                num_frames_with_source);
4866             ++num_thread_infos_dumped;
4867         }
4868     }
4869     return num_thread_infos_dumped;
4870 }
4871 
4872 void
4873 Process::AddInvalidMemoryRegion (const LoadRange &region)
4874 {
4875     m_memory_cache.AddInvalidRange(region.GetRangeBase(), region.GetByteSize());
4876 }
4877 
4878 bool
4879 Process::RemoveInvalidMemoryRange (const LoadRange &region)
4880 {
4881     return m_memory_cache.RemoveInvalidRange(region.GetRangeBase(), region.GetByteSize());
4882 }
4883 
4884 void
4885 Process::AddPreResumeAction (PreResumeActionCallback callback, void *baton)
4886 {
4887     m_pre_resume_actions.push_back(PreResumeCallbackAndBaton (callback, baton));
4888 }
4889 
4890 bool
4891 Process::RunPreResumeActions ()
4892 {
4893     bool result = true;
4894     while (!m_pre_resume_actions.empty())
4895     {
4896         struct PreResumeCallbackAndBaton action = m_pre_resume_actions.back();
4897         m_pre_resume_actions.pop_back();
4898         bool this_result = action.callback (action.baton);
4899         if (result == true) result = this_result;
4900     }
4901     return result;
4902 }
4903 
4904 void
4905 Process::ClearPreResumeActions ()
4906 {
4907     m_pre_resume_actions.clear();
4908 }
4909 
4910 void
4911 Process::Flush ()
4912 {
4913     m_thread_list.Flush();
4914 }
4915