1*30fdc8d8SChris Lattner //===-- ThreadPlan.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 #include "lldb/Target/ThreadPlan.h"
11*30fdc8d8SChris Lattner 
12*30fdc8d8SChris Lattner // C Includes
13*30fdc8d8SChris Lattner // C++ Includes
14*30fdc8d8SChris Lattner // Other libraries and framework includes
15*30fdc8d8SChris Lattner // Project includes
16*30fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
17*30fdc8d8SChris Lattner #include "lldb/Core/Log.h"
18*30fdc8d8SChris Lattner #include "lldb/Core/State.h"
19*30fdc8d8SChris Lattner 
20*30fdc8d8SChris Lattner using namespace lldb;
21*30fdc8d8SChris Lattner using namespace lldb_private;
22*30fdc8d8SChris Lattner 
23*30fdc8d8SChris Lattner //----------------------------------------------------------------------
24*30fdc8d8SChris Lattner // ThreadPlan constructor
25*30fdc8d8SChris Lattner //----------------------------------------------------------------------
26*30fdc8d8SChris Lattner ThreadPlan::ThreadPlan(const char *name, Thread &thread, Vote stop_vote, Vote run_vote) :
27*30fdc8d8SChris Lattner     m_name (name),
28*30fdc8d8SChris Lattner     m_thread (thread),
29*30fdc8d8SChris Lattner     m_plan_complete(false),
30*30fdc8d8SChris Lattner     m_plan_complete_mutex (Mutex::eMutexTypeRecursive),
31*30fdc8d8SChris Lattner     m_plan_private (false),
32*30fdc8d8SChris Lattner     m_stop_vote (stop_vote),
33*30fdc8d8SChris Lattner     m_run_vote (run_vote),
34*30fdc8d8SChris Lattner     m_okay_to_discard (false)
35*30fdc8d8SChris Lattner {
36*30fdc8d8SChris Lattner     SetID (GetNextID());
37*30fdc8d8SChris Lattner }
38*30fdc8d8SChris Lattner 
39*30fdc8d8SChris Lattner //----------------------------------------------------------------------
40*30fdc8d8SChris Lattner // Destructor
41*30fdc8d8SChris Lattner //----------------------------------------------------------------------
42*30fdc8d8SChris Lattner ThreadPlan::~ThreadPlan()
43*30fdc8d8SChris Lattner {
44*30fdc8d8SChris Lattner }
45*30fdc8d8SChris Lattner 
46*30fdc8d8SChris Lattner const char *
47*30fdc8d8SChris Lattner ThreadPlan::GetName () const
48*30fdc8d8SChris Lattner {
49*30fdc8d8SChris Lattner     return m_name.c_str();
50*30fdc8d8SChris Lattner }
51*30fdc8d8SChris Lattner 
52*30fdc8d8SChris Lattner Thread &
53*30fdc8d8SChris Lattner ThreadPlan::GetThread()
54*30fdc8d8SChris Lattner {
55*30fdc8d8SChris Lattner     return m_thread;
56*30fdc8d8SChris Lattner }
57*30fdc8d8SChris Lattner 
58*30fdc8d8SChris Lattner 
59*30fdc8d8SChris Lattner const Thread &
60*30fdc8d8SChris Lattner ThreadPlan::GetThread() const
61*30fdc8d8SChris Lattner {
62*30fdc8d8SChris Lattner     return m_thread;
63*30fdc8d8SChris Lattner }
64*30fdc8d8SChris Lattner 
65*30fdc8d8SChris Lattner bool
66*30fdc8d8SChris Lattner ThreadPlan::IsPlanComplete ()
67*30fdc8d8SChris Lattner {
68*30fdc8d8SChris Lattner     Mutex::Locker (m_plan_complete_mutex);
69*30fdc8d8SChris Lattner     return m_plan_complete;
70*30fdc8d8SChris Lattner }
71*30fdc8d8SChris Lattner 
72*30fdc8d8SChris Lattner void
73*30fdc8d8SChris Lattner ThreadPlan::SetPlanComplete ()
74*30fdc8d8SChris Lattner {
75*30fdc8d8SChris Lattner     Mutex::Locker (m_plan_complete_mutex);
76*30fdc8d8SChris Lattner     m_plan_complete = true;
77*30fdc8d8SChris Lattner }
78*30fdc8d8SChris Lattner 
79*30fdc8d8SChris Lattner bool
80*30fdc8d8SChris Lattner ThreadPlan::MischiefManaged ()
81*30fdc8d8SChris Lattner {
82*30fdc8d8SChris Lattner     Mutex::Locker (m_plan_complete_mutex);
83*30fdc8d8SChris Lattner     m_plan_complete = true;
84*30fdc8d8SChris Lattner     return true;
85*30fdc8d8SChris Lattner }
86*30fdc8d8SChris Lattner 
87*30fdc8d8SChris Lattner Vote
88*30fdc8d8SChris Lattner ThreadPlan::ShouldReportStop (Event *event_ptr)
89*30fdc8d8SChris Lattner {
90*30fdc8d8SChris Lattner     if (m_stop_vote == eVoteNoOpinion)
91*30fdc8d8SChris Lattner     {
92*30fdc8d8SChris Lattner         ThreadPlan *prev_plan = GetPreviousPlan ();
93*30fdc8d8SChris Lattner         if (prev_plan)
94*30fdc8d8SChris Lattner             return prev_plan->ShouldReportStop (event_ptr);
95*30fdc8d8SChris Lattner     }
96*30fdc8d8SChris Lattner     return m_stop_vote;
97*30fdc8d8SChris Lattner }
98*30fdc8d8SChris Lattner 
99*30fdc8d8SChris Lattner Vote
100*30fdc8d8SChris Lattner ThreadPlan::ShouldReportRun (Event *event_ptr)
101*30fdc8d8SChris Lattner {
102*30fdc8d8SChris Lattner     if (m_run_vote == eVoteNoOpinion)
103*30fdc8d8SChris Lattner     {
104*30fdc8d8SChris Lattner         ThreadPlan *prev_plan = GetPreviousPlan ();
105*30fdc8d8SChris Lattner         if (prev_plan)
106*30fdc8d8SChris Lattner             return prev_plan->ShouldReportRun (event_ptr);
107*30fdc8d8SChris Lattner     }
108*30fdc8d8SChris Lattner     return m_run_vote;
109*30fdc8d8SChris Lattner }
110*30fdc8d8SChris Lattner 
111*30fdc8d8SChris Lattner bool
112*30fdc8d8SChris Lattner ThreadPlan::StopOthers ()
113*30fdc8d8SChris Lattner {
114*30fdc8d8SChris Lattner     ThreadPlan *prev_plan;
115*30fdc8d8SChris Lattner     prev_plan = GetPreviousPlan ();
116*30fdc8d8SChris Lattner     if (prev_plan == NULL)
117*30fdc8d8SChris Lattner         return false;
118*30fdc8d8SChris Lattner     else
119*30fdc8d8SChris Lattner         return prev_plan->StopOthers();
120*30fdc8d8SChris Lattner }
121*30fdc8d8SChris Lattner 
122*30fdc8d8SChris Lattner bool
123*30fdc8d8SChris Lattner ThreadPlan::WillResume (StateType resume_state, bool current_plan)
124*30fdc8d8SChris Lattner {
125*30fdc8d8SChris Lattner     if (current_plan)
126*30fdc8d8SChris Lattner     {
127*30fdc8d8SChris Lattner         Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP);
128*30fdc8d8SChris Lattner 
129*30fdc8d8SChris Lattner         if (log)
130*30fdc8d8SChris Lattner             log->Printf("About to resume the \"%s\" plan - state: %s - stop others: %d.",
131*30fdc8d8SChris Lattner                         m_name.c_str(), StateAsCString(resume_state), StopOthers());
132*30fdc8d8SChris Lattner     }
133*30fdc8d8SChris Lattner     return true;
134*30fdc8d8SChris Lattner }
135*30fdc8d8SChris Lattner 
136*30fdc8d8SChris Lattner lldb::user_id_t
137*30fdc8d8SChris Lattner ThreadPlan::GetNextID()
138*30fdc8d8SChris Lattner {
139*30fdc8d8SChris Lattner     static uint32_t g_nextPlanID = 0;
140*30fdc8d8SChris Lattner     return ++g_nextPlanID;
141*30fdc8d8SChris Lattner }
142*30fdc8d8SChris Lattner 
143*30fdc8d8SChris Lattner void
144*30fdc8d8SChris Lattner ThreadPlan::DidPush()
145*30fdc8d8SChris Lattner {
146*30fdc8d8SChris Lattner }
147*30fdc8d8SChris Lattner 
148*30fdc8d8SChris Lattner void
149*30fdc8d8SChris Lattner ThreadPlan::WillPop()
150*30fdc8d8SChris Lattner {
151*30fdc8d8SChris Lattner }
152*30fdc8d8SChris Lattner 
153*30fdc8d8SChris Lattner void
154*30fdc8d8SChris Lattner ThreadPlan::PushPlan (ThreadPlanSP &thread_plan_sp)
155*30fdc8d8SChris Lattner {
156*30fdc8d8SChris Lattner     m_thread.PushPlan (thread_plan_sp);
157*30fdc8d8SChris Lattner }
158*30fdc8d8SChris Lattner 
159*30fdc8d8SChris Lattner ThreadPlan *
160*30fdc8d8SChris Lattner ThreadPlan::GetPreviousPlan ()
161*30fdc8d8SChris Lattner {
162*30fdc8d8SChris Lattner     return m_thread.GetPreviousPlan (this);
163*30fdc8d8SChris Lattner }
164*30fdc8d8SChris Lattner 
165*30fdc8d8SChris Lattner void
166*30fdc8d8SChris Lattner ThreadPlan::SetPrivate (bool input)
167*30fdc8d8SChris Lattner {
168*30fdc8d8SChris Lattner     m_plan_private = input;
169*30fdc8d8SChris Lattner }
170*30fdc8d8SChris Lattner 
171*30fdc8d8SChris Lattner bool
172*30fdc8d8SChris Lattner ThreadPlan::GetPrivate (void)
173*30fdc8d8SChris Lattner {
174*30fdc8d8SChris Lattner     return m_plan_private;
175*30fdc8d8SChris Lattner }
176*30fdc8d8SChris Lattner 
177*30fdc8d8SChris Lattner bool
178*30fdc8d8SChris Lattner ThreadPlan::OkayToDiscard()
179*30fdc8d8SChris Lattner {
180*30fdc8d8SChris Lattner     if (!IsMasterPlan())
181*30fdc8d8SChris Lattner         return true;
182*30fdc8d8SChris Lattner     else
183*30fdc8d8SChris Lattner         return m_okay_to_discard;
184*30fdc8d8SChris Lattner }
185*30fdc8d8SChris Lattner 
186