[Lldb-commits] [lldb] r162250 - /lldb/trunk/source/API/SBValue.cpp

Jim Ingham jingham at apple.com
Mon Aug 20 18:46:35 PDT 2012


Author: jingham
Date: Mon Aug 20 20:46:35 2012
New Revision: 162250

URL: http://llvm.org/viewvc/llvm-project?rev=162250&view=rev
Log:
SBValue::GetTypeName and SBValue::GetByteSize might have to update the dynamic value - which might involve running code.  So they need to take the stop lock & target locks.

<rdar://problem/12001204>

Modified:
    lldb/trunk/source/API/SBValue.cpp

Modified: lldb/trunk/source/API/SBValue.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBValue.cpp?rev=162250&r1=162249&r2=162250&view=diff
==============================================================================
--- lldb/trunk/source/API/SBValue.cpp (original)
+++ lldb/trunk/source/API/SBValue.cpp Mon Aug 20 20:46:35 2012
@@ -137,11 +137,32 @@
 const char *
 SBValue::GetTypeName ()
 {
+    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     const char *name = NULL;
     lldb::ValueObjectSP value_sp(GetSP());
     if (value_sp)
-        name = value_sp->GetQualifiedTypeName().GetCString();
-    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
+    {
+        // For a dynamic type we might have to run code to determine the type we are going to report,
+        // and we might not have updated the type before we get asked this.  So make sure to get the API lock.
+        
+        ProcessSP process_sp(value_sp->GetProcessSP());
+        Process::StopLocker stop_locker;
+        if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
+        {
+            if (log)
+                log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get());
+        }
+        else
+        {
+            TargetSP target_sp(value_sp->GetTargetSP());
+            if (target_sp)
+            {
+                Mutex::Locker api_locker (target_sp->GetAPIMutex());
+                name = value_sp->GetQualifiedTypeName().GetCString();
+            }
+        }
+    }
+    
     if (log)
     {
         if (name)
@@ -156,13 +177,33 @@
 size_t
 SBValue::GetByteSize ()
 {
+    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     size_t result = 0;
 
     lldb::ValueObjectSP value_sp(GetSP());
     if (value_sp)
-        result = value_sp->GetByteSize();
+    {
+        // For a dynamic type we might have to run code to determine the type we are going to report,
+        // and we might not have updated the type before we get asked this.  So make sure to get the API lock.
+        
+        ProcessSP process_sp(value_sp->GetProcessSP());
+        Process::StopLocker stop_locker;
+        if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
+        {
+            if (log)
+                log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get());
+        }
+        else
+        {
+            TargetSP target_sp(value_sp->GetTargetSP());
+            if (target_sp)
+            {
+                Mutex::Locker api_locker (target_sp->GetAPIMutex());
+                result = value_sp->GetByteSize();
+            }
+        }
+    }
 
-    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
         log->Printf ("SBValue(%p)::GetByteSize () => %zu", value_sp.get(), result);
 





More information about the lldb-commits mailing list