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