1*30fdc8d8SChris Lattner //===-- StackFrameList.cpp --------------------------------------*- C++ -*-===// 2*30fdc8d8SChris Lattner // 3*30fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 4*30fdc8d8SChris Lattner // 5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 7*30fdc8d8SChris Lattner // 8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 9*30fdc8d8SChris Lattner 10*30fdc8d8SChris Lattner // C Includes 11*30fdc8d8SChris Lattner // C++ Includes 12*30fdc8d8SChris Lattner // Other libraries and framework includes 13*30fdc8d8SChris Lattner // Project includes 14*30fdc8d8SChris Lattner #include "lldb/Target/StackFrameList.h" 15*30fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h" 16*30fdc8d8SChris Lattner 17*30fdc8d8SChris Lattner using namespace lldb; 18*30fdc8d8SChris Lattner using namespace lldb_private; 19*30fdc8d8SChris Lattner 20*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 21*30fdc8d8SChris Lattner // StackFrameList constructor 22*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 23*30fdc8d8SChris Lattner StackFrameList::StackFrameList() : 24*30fdc8d8SChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 25*30fdc8d8SChris Lattner m_frames (), 26*30fdc8d8SChris Lattner m_current_frame_idx (0) 27*30fdc8d8SChris Lattner { 28*30fdc8d8SChris Lattner } 29*30fdc8d8SChris Lattner 30*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 31*30fdc8d8SChris Lattner // Destructor 32*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 33*30fdc8d8SChris Lattner StackFrameList::~StackFrameList() 34*30fdc8d8SChris Lattner { 35*30fdc8d8SChris Lattner } 36*30fdc8d8SChris Lattner 37*30fdc8d8SChris Lattner 38*30fdc8d8SChris Lattner uint32_t 39*30fdc8d8SChris Lattner StackFrameList::GetNumFrames() const 40*30fdc8d8SChris Lattner { 41*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 42*30fdc8d8SChris Lattner return m_frames.size(); 43*30fdc8d8SChris Lattner } 44*30fdc8d8SChris Lattner 45*30fdc8d8SChris Lattner // After we have determined the number of frames, we can set the count here 46*30fdc8d8SChris Lattner // and have the frame info be generated on demand. 47*30fdc8d8SChris Lattner void 48*30fdc8d8SChris Lattner StackFrameList::SetNumFrames(uint32_t count) 49*30fdc8d8SChris Lattner { 50*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 51*30fdc8d8SChris Lattner return m_frames.resize(count); 52*30fdc8d8SChris Lattner } 53*30fdc8d8SChris Lattner 54*30fdc8d8SChris Lattner StackFrameSP 55*30fdc8d8SChris Lattner StackFrameList::GetFrameAtIndex (uint32_t idx) const 56*30fdc8d8SChris Lattner { 57*30fdc8d8SChris Lattner StackFrameSP frame_sp; 58*30fdc8d8SChris Lattner { 59*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 60*30fdc8d8SChris Lattner if (idx < m_frames.size()) 61*30fdc8d8SChris Lattner frame_sp = m_frames[idx]; 62*30fdc8d8SChris Lattner } 63*30fdc8d8SChris Lattner return frame_sp; 64*30fdc8d8SChris Lattner } 65*30fdc8d8SChris Lattner 66*30fdc8d8SChris Lattner bool 67*30fdc8d8SChris Lattner StackFrameList::SetFrameAtIndex (uint32_t idx, StackFrameSP &frame_sp) 68*30fdc8d8SChris Lattner { 69*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 70*30fdc8d8SChris Lattner if (idx >= m_frames.size()) 71*30fdc8d8SChris Lattner m_frames.resize(idx + 1); 72*30fdc8d8SChris Lattner // Make sure allocation succeeded by checking bounds again 73*30fdc8d8SChris Lattner if (idx < m_frames.size()) 74*30fdc8d8SChris Lattner { 75*30fdc8d8SChris Lattner m_frames[idx] = frame_sp; 76*30fdc8d8SChris Lattner return true; 77*30fdc8d8SChris Lattner } 78*30fdc8d8SChris Lattner return false; // resize failed, out of memory? 79*30fdc8d8SChris Lattner } 80*30fdc8d8SChris Lattner 81*30fdc8d8SChris Lattner uint32_t 82*30fdc8d8SChris Lattner StackFrameList::GetCurrentFrameIndex () const 83*30fdc8d8SChris Lattner { 84*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 85*30fdc8d8SChris Lattner return m_current_frame_idx; 86*30fdc8d8SChris Lattner } 87*30fdc8d8SChris Lattner 88*30fdc8d8SChris Lattner 89*30fdc8d8SChris Lattner uint32_t 90*30fdc8d8SChris Lattner StackFrameList::SetCurrentFrame (lldb_private::StackFrame *frame) 91*30fdc8d8SChris Lattner { 92*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 93*30fdc8d8SChris Lattner const_iterator pos, 94*30fdc8d8SChris Lattner begin = m_frames.begin(), 95*30fdc8d8SChris Lattner end = m_frames.end(); 96*30fdc8d8SChris Lattner for (pos = begin; pos != end; ++pos) 97*30fdc8d8SChris Lattner { 98*30fdc8d8SChris Lattner if (pos->get() == frame) 99*30fdc8d8SChris Lattner { 100*30fdc8d8SChris Lattner m_current_frame_idx = std::distance (begin, pos); 101*30fdc8d8SChris Lattner return m_current_frame_idx; 102*30fdc8d8SChris Lattner } 103*30fdc8d8SChris Lattner } 104*30fdc8d8SChris Lattner m_current_frame_idx = 0; 105*30fdc8d8SChris Lattner return m_current_frame_idx; 106*30fdc8d8SChris Lattner } 107*30fdc8d8SChris Lattner 108*30fdc8d8SChris Lattner // Mark a stack frame as the current frame using the frame index 109*30fdc8d8SChris Lattner void 110*30fdc8d8SChris Lattner StackFrameList::SetCurrentFrameByIndex (uint32_t idx) 111*30fdc8d8SChris Lattner { 112*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 113*30fdc8d8SChris Lattner m_current_frame_idx = idx; 114*30fdc8d8SChris Lattner } 115*30fdc8d8SChris Lattner 116*30fdc8d8SChris Lattner // The thread has been run, reset the number stack frames to zero so we can 117*30fdc8d8SChris Lattner // determine how many frames we have lazily. 118*30fdc8d8SChris Lattner void 119*30fdc8d8SChris Lattner StackFrameList::Clear () 120*30fdc8d8SChris Lattner { 121*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 122*30fdc8d8SChris Lattner m_frames.clear(); 123*30fdc8d8SChris Lattner } 124*30fdc8d8SChris Lattner 125*30fdc8d8SChris Lattner void 126*30fdc8d8SChris Lattner StackFrameList::InvalidateFrames (uint32_t start_idx) 127*30fdc8d8SChris Lattner { 128*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 129*30fdc8d8SChris Lattner size_t num_frames = m_frames.size(); 130*30fdc8d8SChris Lattner while (start_idx < num_frames) 131*30fdc8d8SChris Lattner { 132*30fdc8d8SChris Lattner m_frames[start_idx].reset(); 133*30fdc8d8SChris Lattner ++start_idx; 134*30fdc8d8SChris Lattner } 135*30fdc8d8SChris Lattner } 136