The LLDB API (lldb::SB*) is now thread safe!



git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@122262 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBValue.cpp b/source/API/SBValue.cpp
index 538324c..8161c95 100644
--- a/source/API/SBValue.cpp
+++ b/source/API/SBValue.cpp
@@ -23,6 +23,7 @@
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/StackFrame.h"
+#include "lldb/Target/Target.h"
 #include "lldb/Target/Thread.h"
 
 #include "lldb/API/SBProcess.h"
@@ -135,12 +136,19 @@
 }
 
 bool
-SBValue::IsInScope (const SBFrame &frame)
+SBValue::IsInScope (const SBFrame &sb_frame)
 {
     bool result = false;
 
     if (m_opaque_sp)
-        result = m_opaque_sp->IsInScope (frame.get());
+    {
+        StackFrame *frame = sb_frame.get();
+        if (frame)
+        {
+            Mutex::Locker api_locker (frame->GetThread().GetProcess().GetTarget().GetAPIMutex());
+            result = m_opaque_sp->IsInScope (frame);
+        }
+    }
 
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
@@ -150,18 +158,25 @@
 }
 
 const char *
-SBValue::GetValue (const SBFrame &frame)
+SBValue::GetValue (const SBFrame &sb_frame)
 {
     const char *cstr = NULL;
-    if ( m_opaque_sp)
-        cstr = m_opaque_sp->GetValueAsCString (frame.get());
+    if (m_opaque_sp)
+    {
+        StackFrame *frame = sb_frame.get();
+        if (frame)
+        {
+            Mutex::Locker api_locker (frame->GetThread().GetProcess().GetTarget().GetAPIMutex());
+            cstr = m_opaque_sp->GetValueAsCString (frame);
+        }
+    }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (cstr)
-            log->Printf ("SBValue(%p)::GetValue (SBFrame(%p)) => \"%s\"", m_opaque_sp.get(), frame.get(), cstr);
+            log->Printf ("SBValue(%p)::GetValue (SBFrame(%p)) => \"%s\"", m_opaque_sp.get(), sb_frame.get(), cstr);
         else
-            log->Printf ("SBValue(%p)::GetValue (SBFrame(%p)) => NULL", m_opaque_sp.get(), frame.get());
+            log->Printf ("SBValue(%p)::GetValue (SBFrame(%p)) => NULL", m_opaque_sp.get(), sb_frame.get());
     }
 
     return cstr;
@@ -193,75 +208,110 @@
 }
 
 const char *
-SBValue::GetObjectDescription (const SBFrame &frame)
+SBValue::GetObjectDescription (const SBFrame &sb_frame)
 {
     const char *cstr = NULL;
     if ( m_opaque_sp)
-        cstr = m_opaque_sp->GetObjectDescription (frame.get());
+    {
+        StackFrame *frame = sb_frame.get();
+        if (frame)
+        {
+            Mutex::Locker api_locker (frame->GetThread().GetProcess().GetTarget().GetAPIMutex());
+            cstr = m_opaque_sp->GetObjectDescription (frame);
+        }
+    }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (cstr)
-            log->Printf ("SBValue(%p)::GetObjectDescription (SBFrame(%p)) => \"%s\"", m_opaque_sp.get(), frame.get(), cstr);
+            log->Printf ("SBValue(%p)::GetObjectDescription (SBFrame(%p)) => \"%s\"", m_opaque_sp.get(), sb_frame.get(), cstr);
         else
-            log->Printf ("SBValue(%p)::GetObjectDescription (SBFrame(%p)) => NULL", m_opaque_sp.get(), frame.get());
+            log->Printf ("SBValue(%p)::GetObjectDescription (SBFrame(%p)) => NULL", m_opaque_sp.get(), sb_frame.get());
     }
     return cstr;
 }
 
 bool
-SBValue::GetValueDidChange (const SBFrame &frame)
+SBValue::GetValueDidChange (const SBFrame &sb_frame)
 {
     bool result = false;
     if (m_opaque_sp)
-        result = m_opaque_sp->GetValueDidChange (frame.get());
+    {
+        StackFrame *frame = sb_frame.get();
+        if (frame)
+        {
+            Mutex::Locker api_locker (frame->GetThread().GetProcess().GetTarget().GetAPIMutex());
+            result = m_opaque_sp->GetValueDidChange (frame);
+        }
+    }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::GetValueDidChange (SBFrame(%p)) => %i", m_opaque_sp.get(), frame.get(), result);
+        log->Printf ("SBValue(%p)::GetValueDidChange (SBFrame(%p)) => %i", m_opaque_sp.get(), sb_frame.get(), result);
 
     return result;
 }
 
 const char *
-SBValue::GetSummary (const SBFrame &frame)
+SBValue::GetSummary (const SBFrame &sb_frame)
 {
     const char *cstr = NULL;
     if (m_opaque_sp)
-        cstr = m_opaque_sp->GetSummaryAsCString(frame.get());
+    {
+        StackFrame *frame = sb_frame.get();
+        if (frame)
+        {
+            Mutex::Locker api_locker (frame->GetThread().GetProcess().GetTarget().GetAPIMutex());
+            cstr = m_opaque_sp->GetSummaryAsCString(frame);
+        }
+    }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (cstr)
-            log->Printf ("SBValue(%p)::GetSummary (SBFrame(%p)) => \"%s\"", m_opaque_sp.get(), frame.get(), cstr);
+            log->Printf ("SBValue(%p)::GetSummary (SBFrame(%p)) => \"%s\"", m_opaque_sp.get(), sb_frame.get(), cstr);
         else
-            log->Printf ("SBValue(%p)::GetSummary (SBFrame(%p)) => NULL", m_opaque_sp.get(), frame.get());
+            log->Printf ("SBValue(%p)::GetSummary (SBFrame(%p)) => NULL", m_opaque_sp.get(), sb_frame.get());
     }
     return cstr;
 }
 
 const char *
-SBValue::GetLocation (const SBFrame &frame)
+SBValue::GetLocation (const SBFrame &sb_frame)
 {
     const char *cstr = NULL;
     if (m_opaque_sp)
-        cstr = m_opaque_sp->GetLocationAsCString(frame.get());
+    {
+        StackFrame *frame = sb_frame.get();
+        if (frame)
+        {
+            Mutex::Locker api_locker (frame->GetThread().GetProcess().GetTarget().GetAPIMutex());
+            cstr = m_opaque_sp->GetLocationAsCString(frame);
+        }
+    }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (cstr)
-            log->Printf ("SBValue(%p)::GetSummary (SBFrame(%p)) => \"%s\"", m_opaque_sp.get(), frame.get(), cstr);
+            log->Printf ("SBValue(%p)::GetSummary (SBFrame(%p)) => \"%s\"", m_opaque_sp.get(), sb_frame.get(), cstr);
         else
-            log->Printf ("SBValue(%p)::GetSummary (SBFrame(%p)) => NULL", m_opaque_sp.get(), frame.get());
+            log->Printf ("SBValue(%p)::GetSummary (SBFrame(%p)) => NULL", m_opaque_sp.get(), sb_frame.get());
     }
     return cstr;
 }
 
 bool
-SBValue::SetValueFromCString (const SBFrame &frame, const char *value_str)
+SBValue::SetValueFromCString (const SBFrame &sb_frame, const char *value_str)
 {
     bool success = false;
     if (m_opaque_sp)
-        success = m_opaque_sp->SetValueFromCString (frame.get(), value_str);
+    {
+        StackFrame *frame = sb_frame.get();
+        if (frame)
+        {
+            Mutex::Locker api_locker (frame->GetThread().GetProcess().GetTarget().GetAPIMutex());
+            success = m_opaque_sp->SetValueFromCString (frame, value_str);
+        }
+    }
     return success;
 }
 
@@ -336,17 +386,6 @@
     return num_children;
 }
 
-bool
-SBValue::ValueIsStale ()
-{
-    bool result = true;
-
-    if (m_opaque_sp)
-        result = m_opaque_sp->GetValueIsValid();
-
-    return result;
-}
-
 
 SBValue
 SBValue::Dereference ()
@@ -354,8 +393,8 @@
     SBValue sb_value;
     if (m_opaque_sp)
     {
-        if (m_opaque_sp->IsPointerType())
-            sb_value = GetChildAtIndex(0);
+        Error error;
+        sb_value = m_opaque_sp->Dereference (error);
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)