diff options
| author | Greg Clayton <gclayton@apple.com> | 2011-05-20 23:51:26 +0000 |
|---|---|---|
| committer | Greg Clayton <gclayton@apple.com> | 2011-05-20 23:51:26 +0000 |
| commit | 21c5ab4fe135ae4855f65de7ae07309747b57041 (patch) | |
| tree | ec6197be476ebe5e264069431d82b7f84445ebd4 /lldb/source/API/SBValue.cpp | |
| parent | 109b127e02cf6e233b59f72a5edc6d5c40a1fe0a (diff) | |
| download | bcm5719-llvm-21c5ab4fe135ae4855f65de7ae07309747b57041.tar.gz bcm5719-llvm-21c5ab4fe135ae4855f65de7ae07309747b57041.zip | |
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.
llvm-svn: 131771
Diffstat (limited to 'lldb/source/API/SBValue.cpp')
| -rw-r--r-- | lldb/source/API/SBValue.cpp | 64 |
1 files changed, 42 insertions, 22 deletions
diff --git a/lldb/source/API/SBValue.cpp b/lldb/source/API/SBValue.cpp index 03ac1273b73..156f918f304 100644 --- a/lldb/source/API/SBValue.cpp +++ b/lldb/source/API/SBValue.cpp @@ -348,21 +348,20 @@ SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic) { 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 @@ SBValue::GetIndexOfChildWithName (const char *name) { 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 @@ SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dy 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 @@ SBValue::GetNumChildren () 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::Dereference () 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 @@ SBValue::TypeIsPointerType () 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 @@ void * 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; } |

