jpienaar wrote:

I agree a condition variable would work here. I realized this later too (wanted 
all destroyed at end), one could do that as follows too

// In ManualDWARFIndex
...
   std::vector<DWARFUnit::ScopedExtractDIEs> clear_cu_dies;
    clear_cu_dies.reserve(units_to_index.size());
    for (auto &unit : units_to_index) clear_cu_dies.push_back(*unit);
    for_each_unit([&clear_cu_dies](size_t, size_t idx, DWARFUnit*) {
      clear_cu_dies[idx].Extract();
    });
...

// in DWARFUnit.cpp

void DWARFUnit::ScopedExtractDIEs::Extract() {
  {
    llvm::sys::ScopedReader lock(m_cu->m_die_array_mutex);
    if (!m_cu->m_die_array.empty())
      return; // Already parsed
  }
  llvm::sys::ScopedWriter lock(m_cu->m_die_array_mutex);
  if (!m_cu->m_die_array.empty())
    return; // Already parsed

  // Otherwise m_die_array would be already populated.
  lldbassert(!m_cu->m_cancel_scopes);

  m_cu->ExtractDIEsRWLocked();
  m_clear_dies = true;
}

DWARFUnit::ScopedExtractDIEs DWARFUnit::ExtractDIEsScoped() {
  ScopedExtractDIEs scoped(*this);
  scoped.Extract();
  return scoped;
}
---

But if plain counter preferred, will switch to that.

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