Expanded the flags that can be set for a command object in lldb_private::CommandObject. This list of available flags are:

enum
{
    //----------------------------------------------------------------------
    // eFlagRequiresTarget
    //
    // Ensures a valid target is contained in m_exe_ctx prior to executing
    // the command. If a target doesn't exist or is invalid, the command
    // will fail and CommandObject::GetInvalidTargetDescription() will be
    // returned as the error. CommandObject subclasses can override the
    // virtual function for GetInvalidTargetDescription() to provide custom
    // strings when needed.
    //----------------------------------------------------------------------
    eFlagRequiresTarget         = (1u << 0),
    //----------------------------------------------------------------------
    // eFlagRequiresProcess
    //
    // Ensures a valid process is contained in m_exe_ctx prior to executing
    // the command. If a process doesn't exist or is invalid, the command
    // will fail and CommandObject::GetInvalidProcessDescription() will be
    // returned as the error. CommandObject subclasses can override the
    // virtual function for GetInvalidProcessDescription() to provide custom
    // strings when needed.
    //----------------------------------------------------------------------
    eFlagRequiresProcess        = (1u << 1),
    //----------------------------------------------------------------------
    // eFlagRequiresThread
    //
    // Ensures a valid thread is contained in m_exe_ctx prior to executing
    // the command. If a thread doesn't exist or is invalid, the command
    // will fail and CommandObject::GetInvalidThreadDescription() will be
    // returned as the error. CommandObject subclasses can override the
    // virtual function for GetInvalidThreadDescription() to provide custom
    // strings when needed.
    //----------------------------------------------------------------------
    eFlagRequiresThread         = (1u << 2),
    //----------------------------------------------------------------------
    // eFlagRequiresFrame
    //
    // Ensures a valid frame is contained in m_exe_ctx prior to executing
    // the command. If a frame doesn't exist or is invalid, the command
    // will fail and CommandObject::GetInvalidFrameDescription() will be
    // returned as the error. CommandObject subclasses can override the
    // virtual function for GetInvalidFrameDescription() to provide custom
    // strings when needed.
    //----------------------------------------------------------------------
    eFlagRequiresFrame          = (1u << 3),
    //----------------------------------------------------------------------
    // eFlagRequiresRegContext
    //
    // Ensures a valid register context (from the selected frame if there
    // is a frame in m_exe_ctx, or from the selected thread from m_exe_ctx)
    // is availble from m_exe_ctx prior to executing the command. If a
    // target doesn't exist or is invalid, the command will fail and
    // CommandObject::GetInvalidRegContextDescription() will be returned as
    // the error. CommandObject subclasses can override the virtual function
    // for GetInvalidRegContextDescription() to provide custom strings when
    // needed.
    //----------------------------------------------------------------------
    eFlagRequiresRegContext     = (1u << 4),
    //----------------------------------------------------------------------
    // eFlagTryTargetAPILock
    //
    // Attempts to acquire the target lock if a target is selected in the
    // command interpreter. If the command object fails to acquire the API
    // lock, the command will fail with an appropriate error message.
    //----------------------------------------------------------------------
    eFlagTryTargetAPILock       = (1u << 5),
    //----------------------------------------------------------------------
    // eFlagProcessMustBeLaunched
    //
    // Verifies that there is a launched process in m_exe_ctx, if there
    // isn't, the command will fail with an appropriate error message.
    //----------------------------------------------------------------------
    eFlagProcessMustBeLaunched  = (1u << 6),
    //----------------------------------------------------------------------
    // eFlagProcessMustBePaused
    //
    // Verifies that there is a paused process in m_exe_ctx, if there
    // isn't, the command will fail with an appropriate error message.
    //----------------------------------------------------------------------
    eFlagProcessMustBePaused    = (1u << 7)
};

Now each command object contains a "ExecutionContext m_exe_ctx;" member variable that gets initialized prior to running the command. The validity of the target objects in m_exe_ctx are checked to ensure that any target/process/thread/frame/reg context that are required are valid prior to executing the command. Each command object also contains a Mutex::Locker m_api_locker which gets used if eFlagTryTargetAPILock is set. This centralizes a lot of checking code that was previously and inconsistently implemented across many commands.

llvm-svn: 171990
diff --git a/lldb/source/Commands/CommandObjectSettings.cpp b/lldb/source/Commands/CommandObjectSettings.cpp
index 6a6e8a6..c7502d1 100644
--- a/lldb/source/Commands/CommandObjectSettings.cpp
+++ b/lldb/source/Commands/CommandObjectSettings.cpp
@@ -202,12 +202,10 @@
                 }
                 else
                 {
-                    ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
-
                     // Complete setting value
                     const char *setting_var_name = input.GetArgumentAtIndex(setting_var_idx);
                     Error error;
-                    lldb::OptionValueSP value_sp (m_interpreter.GetDebugger().GetPropertyValue(&exe_ctx, setting_var_name, false, error));
+                    lldb::OptionValueSP value_sp (m_interpreter.GetDebugger().GetPropertyValue(&m_exe_ctx, setting_var_name, false, error));
                     if (value_sp)
                     {
                         value_sp->AutoComplete (m_interpreter,
@@ -256,7 +254,6 @@
         StripLeadingSpaces(var_value_str);
         std::string var_value_string = var_value_str.str();
 
-        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
         Error error;
         if (m_options.m_global)
         {
@@ -268,7 +265,7 @@
         
         if (error.Success())
         {
-            error = m_interpreter.GetDebugger().SetPropertyValue (&exe_ctx,
+            error = m_interpreter.GetDebugger().SetPropertyValue (&m_exe_ctx,
                                                                   eVarSetOperationAssign,
                                                                   var_name,
                                                                   var_value_string.c_str());
@@ -357,7 +354,6 @@
     virtual bool
     DoExecute (Args& args, CommandReturnObject &result)
     {
-        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
         result.SetStatus (eReturnStatusSuccessFinishResult);
 
         const size_t argc = args.GetArgumentCount ();
@@ -367,7 +363,7 @@
             {
                 const char *property_path = args.GetArgumentAtIndex (i);
 
-                Error error(m_interpreter.GetDebugger().DumpPropertyValue (&exe_ctx, result.GetOutputStream(), property_path, OptionValue::eDumpGroupValue));
+                Error error(m_interpreter.GetDebugger().DumpPropertyValue (&m_exe_ctx, result.GetOutputStream(), property_path, OptionValue::eDumpGroupValue));
                 if (error.Success())
                 {
                     result.GetOutputStream().EOL();
@@ -381,7 +377,7 @@
         }
         else
         {
-            m_interpreter.GetDebugger().DumpAllPropertyValues (& exe_ctx, result.GetOutputStream(), OptionValue::eDumpGroupValue);
+            m_interpreter.GetDebugger().DumpAllPropertyValues (&m_exe_ctx, result.GetOutputStream(), OptionValue::eDumpGroupValue);
         }
 
         return result.Succeeded();
@@ -450,7 +446,6 @@
     virtual bool
     DoExecute (Args& args, CommandReturnObject &result)
     {
-        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
         result.SetStatus (eReturnStatusSuccessFinishResult);
 
         const bool will_modify = false;
@@ -463,7 +458,7 @@
             {
                 const char *property_path = args.GetArgumentAtIndex (i);
                 
-                const Property *property = m_interpreter.GetDebugger().GetValueProperties()->GetPropertyAtPath (&exe_ctx, will_modify, property_path);
+                const Property *property = m_interpreter.GetDebugger().GetValueProperties()->GetPropertyAtPath (&m_exe_ctx, will_modify, property_path);
 
                 if (property)
                 {
@@ -592,8 +587,7 @@
         StripLeadingSpaces(var_value_str);
         std::string var_value_string = var_value_str.str();
         
-        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
-        Error error (m_interpreter.GetDebugger().SetPropertyValue (&exe_ctx,
+        Error error (m_interpreter.GetDebugger().SetPropertyValue (&m_exe_ctx,
                                                                    eVarSetOperationRemove,
                                                                    var_name,
                                                                    var_value_string.c_str()));
@@ -719,8 +713,7 @@
         StripLeadingSpaces(var_value_str);
         std::string var_value_string = var_value_str.str();
 
-        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
-        Error error(m_interpreter.GetDebugger().SetPropertyValue (&exe_ctx,
+        Error error(m_interpreter.GetDebugger().SetPropertyValue (&m_exe_ctx,
                                                                   eVarSetOperationReplace,
                                                                   var_name,
                                                                   var_value_string.c_str()));
@@ -853,8 +846,7 @@
         StripLeadingSpaces(var_value_str);
         std::string var_value_string = var_value_str.str();
 
-        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
-        Error error(m_interpreter.GetDebugger().SetPropertyValue (&exe_ctx,
+        Error error(m_interpreter.GetDebugger().SetPropertyValue (&m_exe_ctx,
                                                                   eVarSetOperationInsertBefore,
                                                                   var_name,
                                                                   var_value_string.c_str()));
@@ -982,8 +974,7 @@
         StripLeadingSpaces(var_value_str);
         std::string var_value_string = var_value_str.str();
 
-        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
-        Error error(m_interpreter.GetDebugger().SetPropertyValue (&exe_ctx,
+        Error error(m_interpreter.GetDebugger().SetPropertyValue (&m_exe_ctx,
                                                                   eVarSetOperationInsertAfter,
                                                                   var_name,
                                                                   var_value_string.c_str()));
@@ -1102,8 +1093,7 @@
         StripLeadingSpaces(var_value_str);
         std::string var_value_string = var_value_str.str();
 
-        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
-        Error error(m_interpreter.GetDebugger().SetPropertyValue (&exe_ctx,
+        Error error(m_interpreter.GetDebugger().SetPropertyValue (&m_exe_ctx,
                                                                   eVarSetOperationAppend,
                                                                   var_name,
                                                                   var_value_string.c_str()));
@@ -1196,8 +1186,7 @@
             return false;
         }
         
-        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
-        Error error (m_interpreter.GetDebugger().SetPropertyValue (&exe_ctx,
+        Error error (m_interpreter.GetDebugger().SetPropertyValue (&m_exe_ctx,
                                                                    eVarSetOperationClear,
                                                                    var_name,
                                                                    NULL));