================
@@ -189,17 +189,23 @@ DWARFUnit::ScopedExtractDIEs 
DWARFUnit::ExtractDIEsScoped() {
 }
 
 DWARFUnit::ScopedExtractDIEs::ScopedExtractDIEs(DWARFUnit &cu) : m_cu(&cu) {
-  m_cu->m_die_array_scoped_mutex.lock_shared();
+  llvm::sys::ScopedLock lock(m_cu->m_die_array_scoped_mutex);
+  ++m_cu->m_die_array_scoped_count;
 }
 
 DWARFUnit::ScopedExtractDIEs::~ScopedExtractDIEs() {
   if (!m_cu)
     return;
-  m_cu->m_die_array_scoped_mutex.unlock_shared();
+  {
+    llvm::sys::ScopedLock lock(m_cu->m_die_array_scoped_mutex);
+    --m_cu->m_die_array_scoped_count;
+    if (m_cu->m_die_array_scoped_count == 0)
+      return;
+  }
   if (!m_clear_dies || m_cu->m_cancel_scopes)
     return;
   // Be sure no other ScopedExtractDIEs is running anymore.
----------------
labath wrote:

I think all of this can/should be one critical section. The reason the code was 
originally doing the unlock is because it was switching the lock type 
(shared->exclusive). So, I think something like this ought to do it:

```
  llvm::sys::ScopedLock lock(m_cu->m_die_array_scoped_mutex);
  --m_cu->m_die_array_scoped_count;
  if (m_cu->m_die_array_scoped_count == 0 && m_clear_dies && 
!m_cu->m_cancel_scopes)
    m_cu->ClearDIEsRWLocked();
```

https://github.com/llvm/llvm-project/pull/139252
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to