================ @@ -578,58 +607,36 @@ void StackFrameList::Dump(Stream *s) { StackFrameSP StackFrameList::GetFrameAtIndex(uint32_t idx) { StackFrameSP frame_sp; - std::lock_guard<std::recursive_mutex> guard(m_mutex); uint32_t original_idx = idx; - uint32_t inlined_depth = GetCurrentInlinedDepth(); - if (inlined_depth != UINT32_MAX) - idx += inlined_depth; + // We're going to consult the m_frames.size, but if there are already + // enough frames for our request we don't want to block other readers, so + // first acquire the shared lock: + { // Scope for shared lock: + std::shared_lock<std::shared_mutex> guard(m_list_mutex); + + uint32_t inlined_depth = GetCurrentInlinedDepth(); + if (inlined_depth != UINT32_MAX) + idx += inlined_depth; - if (idx < m_frames.size()) - frame_sp = m_frames[idx]; + if (idx < m_frames.size()) + frame_sp = m_frames[idx]; - if (frame_sp) - return frame_sp; + if (frame_sp) + return frame_sp; ---------------- jimingham wrote:
I don't think that helps much. Of the current two uses, GetNumFrames doesn't return the frame of the index passed in, and GetFrameAtIndex has a fallback that would still require the shared lock. https://github.com/llvm/llvm-project/pull/117252 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits