Lock the target API mutex correctly in all cases and make sure m_opaque_sp
contains a valid pointer before trying to access the target.



git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@131771 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBValue.cpp b/source/API/SBValue.cpp
index 03ac127..156f918 100644
--- a/source/API/SBValue.cpp
+++ b/source/API/SBValue.cpp
@@ -348,21 +348,20 @@
 {
     lldb::ValueObjectSP child_sp;
 
-    if (m_opaque_sp->GetUpdatePoint().GetTarget())
-        Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex());
-
     if (m_opaque_sp)
     {
+        if (m_opaque_sp->GetUpdatePoint().GetTarget())
+            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex());
+        
         child_sp = m_opaque_sp->GetChildAtIndex (idx, true);
-    }
-
-    if (use_dynamic != lldb::eNoDynamicValues)
-    {
-        if (child_sp)
+        if (use_dynamic != lldb::eNoDynamicValues)
         {
-            lldb::ValueObjectSP dynamic_sp = child_sp->GetDynamicValue (use_dynamic);
-            if (dynamic_sp)
-                child_sp = dynamic_sp;
+            if (child_sp)
+            {
+                lldb::ValueObjectSP dynamic_sp = child_sp->GetDynamicValue (use_dynamic);
+                if (dynamic_sp)
+                    child_sp = dynamic_sp;
+            }
         }
     }
     
@@ -379,7 +378,12 @@
 {
     uint32_t idx = UINT32_MAX;
     if (m_opaque_sp)
+    {
+        if (m_opaque_sp->GetUpdatePoint().GetTarget())
+            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex());
+        
         idx = m_opaque_sp->GetIndexOfChildWithName (ConstString(name));
+    }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
@@ -404,22 +408,20 @@
     lldb::ValueObjectSP child_sp;
     const ConstString str_name (name);
 
-    if (m_opaque_sp->GetUpdatePoint().GetTarget())
-        Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex());
-    
 
     if (m_opaque_sp)
     {
+        if (m_opaque_sp->GetUpdatePoint().GetTarget())
+            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex());
         child_sp = m_opaque_sp->GetChildMemberWithName (str_name, true);
-    }
-
-    if (use_dynamic_value != lldb::eNoDynamicValues)
-    {
-        if (child_sp)
+        if (use_dynamic_value != lldb::eNoDynamicValues)
         {
-            lldb::ValueObjectSP dynamic_sp = child_sp->GetDynamicValue (use_dynamic_value);
-            if (dynamic_sp)
-                child_sp = dynamic_sp;
+            if (child_sp)
+            {
+                lldb::ValueObjectSP dynamic_sp = child_sp->GetDynamicValue (use_dynamic_value);
+                if (dynamic_sp)
+                    child_sp = dynamic_sp;
+            }
         }
     }
     
@@ -439,7 +441,12 @@
     uint32_t num_children = 0;
 
     if (m_opaque_sp)
+    {
+        if (m_opaque_sp->GetUpdatePoint().GetTarget())
+            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex());
+
         num_children = m_opaque_sp->GetNumChildren();
+    }
 
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
@@ -455,6 +462,9 @@
     SBValue sb_value;
     if (m_opaque_sp)
     {
+        if (m_opaque_sp->GetUpdatePoint().GetTarget())
+            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex());
+
         Error error;
         sb_value = m_opaque_sp->Dereference (error);
     }
@@ -471,7 +481,12 @@
     bool is_ptr_type = false;
 
     if (m_opaque_sp)
+    {
+        if (m_opaque_sp->GetUpdatePoint().GetTarget())
+            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex());
+
         is_ptr_type = m_opaque_sp->IsPointerType();
+    }
 
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
@@ -485,7 +500,12 @@
 SBValue::GetOpaqueType()
 {
     if (m_opaque_sp)
+    {
+        if (m_opaque_sp->GetUpdatePoint().GetTarget())
+            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex());
+
         return m_opaque_sp->GetClangType();
+    }
     return NULL;
 }