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