1*5e8dce4dSJason Molenda //===-- SBQueue.cpp ---------------------------------------------*- C++ -*-===//
2*5e8dce4dSJason Molenda //
3*5e8dce4dSJason Molenda //                     The LLVM Compiler Infrastructure
4*5e8dce4dSJason Molenda //
5*5e8dce4dSJason Molenda // This file is distributed under the University of Illinois Open Source
6*5e8dce4dSJason Molenda // License. See LICENSE.TXT for details.
7*5e8dce4dSJason Molenda //
8*5e8dce4dSJason Molenda //===----------------------------------------------------------------------===//
9*5e8dce4dSJason Molenda 
10*5e8dce4dSJason Molenda #include "lldb/lldb-python.h"
11*5e8dce4dSJason Molenda 
12*5e8dce4dSJason Molenda #include "lldb/API/SBQueue.h"
13*5e8dce4dSJason Molenda 
14*5e8dce4dSJason Molenda #include "lldb/API/SBProcess.h"
15*5e8dce4dSJason Molenda #include "lldb/API/SBThread.h"
16*5e8dce4dSJason Molenda #include "lldb/Core/Log.h"
17*5e8dce4dSJason Molenda #include "lldb/Target/Process.h"
18*5e8dce4dSJason Molenda #include "lldb/Target/Queue.h"
19*5e8dce4dSJason Molenda #include "lldb/Target/QueueItem.h"
20*5e8dce4dSJason Molenda #include "lldb/Target/Thread.h"
21*5e8dce4dSJason Molenda 
22*5e8dce4dSJason Molenda using namespace lldb;
23*5e8dce4dSJason Molenda using namespace lldb_private;
24*5e8dce4dSJason Molenda 
25*5e8dce4dSJason Molenda //----------------------------------------------------------------------
26*5e8dce4dSJason Molenda // Constructors
27*5e8dce4dSJason Molenda //----------------------------------------------------------------------
28*5e8dce4dSJason Molenda SBQueue::SBQueue () :
29*5e8dce4dSJason Molenda     m_queue_wp(),
30*5e8dce4dSJason Molenda     m_threads(),
31*5e8dce4dSJason Molenda     m_thread_list_fetched(false),
32*5e8dce4dSJason Molenda     m_items(),
33*5e8dce4dSJason Molenda     m_queue_items_fetched(false)
34*5e8dce4dSJason Molenda {
35*5e8dce4dSJason Molenda }
36*5e8dce4dSJason Molenda 
37*5e8dce4dSJason Molenda SBQueue::SBQueue (const QueueSP& queue_sp) :
38*5e8dce4dSJason Molenda     m_queue_wp(queue_sp),
39*5e8dce4dSJason Molenda     m_threads(),
40*5e8dce4dSJason Molenda     m_thread_list_fetched(false),
41*5e8dce4dSJason Molenda     m_items(),
42*5e8dce4dSJason Molenda     m_queue_items_fetched(false)
43*5e8dce4dSJason Molenda {
44*5e8dce4dSJason Molenda }
45*5e8dce4dSJason Molenda 
46*5e8dce4dSJason Molenda //----------------------------------------------------------------------
47*5e8dce4dSJason Molenda // Destructor
48*5e8dce4dSJason Molenda //----------------------------------------------------------------------
49*5e8dce4dSJason Molenda SBQueue::~SBQueue()
50*5e8dce4dSJason Molenda {
51*5e8dce4dSJason Molenda     m_threads.clear();
52*5e8dce4dSJason Molenda     m_items.clear();
53*5e8dce4dSJason Molenda }
54*5e8dce4dSJason Molenda 
55*5e8dce4dSJason Molenda bool
56*5e8dce4dSJason Molenda SBQueue::IsValid() const
57*5e8dce4dSJason Molenda {
58*5e8dce4dSJason Molenda     QueueSP queue_sp = m_queue_wp.lock();
59*5e8dce4dSJason Molenda     return queue_sp.get() != NULL;
60*5e8dce4dSJason Molenda }
61*5e8dce4dSJason Molenda 
62*5e8dce4dSJason Molenda 
63*5e8dce4dSJason Molenda void
64*5e8dce4dSJason Molenda SBQueue::Clear ()
65*5e8dce4dSJason Molenda {
66*5e8dce4dSJason Molenda     m_queue_wp.reset();
67*5e8dce4dSJason Molenda     m_thread_list_fetched = false;
68*5e8dce4dSJason Molenda     m_threads.clear();
69*5e8dce4dSJason Molenda     m_queue_items_fetched = false;
70*5e8dce4dSJason Molenda     m_items.clear();
71*5e8dce4dSJason Molenda }
72*5e8dce4dSJason Molenda 
73*5e8dce4dSJason Molenda 
74*5e8dce4dSJason Molenda void
75*5e8dce4dSJason Molenda SBQueue::SetQueue (const QueueSP& queue_sp)
76*5e8dce4dSJason Molenda {
77*5e8dce4dSJason Molenda     m_queue_wp = queue_sp;
78*5e8dce4dSJason Molenda     m_thread_list_fetched = false;
79*5e8dce4dSJason Molenda     m_threads.clear();
80*5e8dce4dSJason Molenda     m_queue_items_fetched = false;
81*5e8dce4dSJason Molenda     m_items.clear();
82*5e8dce4dSJason Molenda }
83*5e8dce4dSJason Molenda 
84*5e8dce4dSJason Molenda lldb::queue_id_t
85*5e8dce4dSJason Molenda SBQueue::GetQueueID () const
86*5e8dce4dSJason Molenda {
87*5e8dce4dSJason Molenda     queue_id_t result = LLDB_INVALID_QUEUE_ID;
88*5e8dce4dSJason Molenda     QueueSP queue_sp = m_queue_wp.lock();
89*5e8dce4dSJason Molenda     if (queue_sp)
90*5e8dce4dSJason Molenda     {
91*5e8dce4dSJason Molenda         result = queue_sp->GetID();
92*5e8dce4dSJason Molenda     }
93*5e8dce4dSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
94*5e8dce4dSJason Molenda     if (log)
95*5e8dce4dSJason Molenda         log->Printf ("SBQueue(%p)::GetQueueID () => 0x%" PRIx64, this, result);
96*5e8dce4dSJason Molenda     return result;
97*5e8dce4dSJason Molenda }
98*5e8dce4dSJason Molenda 
99*5e8dce4dSJason Molenda uint32_t
100*5e8dce4dSJason Molenda SBQueue::GetIndexID () const
101*5e8dce4dSJason Molenda {
102*5e8dce4dSJason Molenda     uint32_t result = LLDB_INVALID_INDEX32;
103*5e8dce4dSJason Molenda     QueueSP queue_sp = m_queue_wp.lock();
104*5e8dce4dSJason Molenda     if (queue_sp)
105*5e8dce4dSJason Molenda     {
106*5e8dce4dSJason Molenda         result = queue_sp->GetIndexID();
107*5e8dce4dSJason Molenda     }
108*5e8dce4dSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
109*5e8dce4dSJason Molenda     if (log)
110*5e8dce4dSJason Molenda         log->Printf ("SBQueue(%p)::GetIndexID () => %d", this, result);
111*5e8dce4dSJason Molenda     return result;
112*5e8dce4dSJason Molenda }
113*5e8dce4dSJason Molenda 
114*5e8dce4dSJason Molenda const char *
115*5e8dce4dSJason Molenda SBQueue::GetName () const
116*5e8dce4dSJason Molenda {
117*5e8dce4dSJason Molenda     const char *name = NULL;
118*5e8dce4dSJason Molenda     QueueSP queue_sp = m_queue_wp.lock ();
119*5e8dce4dSJason Molenda     if (queue_sp.get())
120*5e8dce4dSJason Molenda     {
121*5e8dce4dSJason Molenda         name = queue_sp->GetName();
122*5e8dce4dSJason Molenda     }
123*5e8dce4dSJason Molenda 
124*5e8dce4dSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
125*5e8dce4dSJason Molenda     if (log)
126*5e8dce4dSJason Molenda         log->Printf ("SBQueue(%p)::GetName () => %s", this, name ? name : "NULL");
127*5e8dce4dSJason Molenda 
128*5e8dce4dSJason Molenda     return name;
129*5e8dce4dSJason Molenda }
130*5e8dce4dSJason Molenda 
131*5e8dce4dSJason Molenda void
132*5e8dce4dSJason Molenda SBQueue::FetchThreads ()
133*5e8dce4dSJason Molenda {
134*5e8dce4dSJason Molenda     if (m_thread_list_fetched == false)
135*5e8dce4dSJason Molenda     {
136*5e8dce4dSJason Molenda         QueueSP queue_sp = m_queue_wp.lock();
137*5e8dce4dSJason Molenda         if (queue_sp)
138*5e8dce4dSJason Molenda         {
139*5e8dce4dSJason Molenda             Process::StopLocker stop_locker;
140*5e8dce4dSJason Molenda             if (stop_locker.TryLock (&queue_sp->GetProcess()->GetRunLock()))
141*5e8dce4dSJason Molenda             {
142*5e8dce4dSJason Molenda                 const std::vector<ThreadSP> thread_list(queue_sp->GetThreads());
143*5e8dce4dSJason Molenda                 m_thread_list_fetched = true;
144*5e8dce4dSJason Molenda                 const uint32_t num_threads = thread_list.size();
145*5e8dce4dSJason Molenda                 for (uint32_t idx = 0; idx < num_threads; ++idx)
146*5e8dce4dSJason Molenda                 {
147*5e8dce4dSJason Molenda                     ThreadSP thread_sp = thread_list[idx];
148*5e8dce4dSJason Molenda                     if (thread_sp && thread_sp->IsValid())
149*5e8dce4dSJason Molenda                     {
150*5e8dce4dSJason Molenda                         m_threads.push_back (thread_sp);
151*5e8dce4dSJason Molenda                     }
152*5e8dce4dSJason Molenda                 }
153*5e8dce4dSJason Molenda             }
154*5e8dce4dSJason Molenda         }
155*5e8dce4dSJason Molenda     }
156*5e8dce4dSJason Molenda }
157*5e8dce4dSJason Molenda 
158*5e8dce4dSJason Molenda void
159*5e8dce4dSJason Molenda SBQueue::FetchItems ()
160*5e8dce4dSJason Molenda {
161*5e8dce4dSJason Molenda     if (m_queue_items_fetched == false)
162*5e8dce4dSJason Molenda     {
163*5e8dce4dSJason Molenda         QueueSP queue_sp = m_queue_wp.lock();
164*5e8dce4dSJason Molenda         if (queue_sp)
165*5e8dce4dSJason Molenda         {
166*5e8dce4dSJason Molenda             Process::StopLocker stop_locker;
167*5e8dce4dSJason Molenda             if (stop_locker.TryLock (&queue_sp->GetProcess()->GetRunLock()))
168*5e8dce4dSJason Molenda             {
169*5e8dce4dSJason Molenda                 const std::vector<QueueItemSP> queue_items(queue_sp->GetItems());
170*5e8dce4dSJason Molenda                 m_queue_items_fetched = true;
171*5e8dce4dSJason Molenda                 const uint32_t num_items = queue_items.size();
172*5e8dce4dSJason Molenda                 for (uint32_t idx = 0; idx < num_items; ++idx)
173*5e8dce4dSJason Molenda                 {
174*5e8dce4dSJason Molenda                     QueueItemSP item = queue_items[idx];
175*5e8dce4dSJason Molenda                     if (item && item->IsValid())
176*5e8dce4dSJason Molenda                     {
177*5e8dce4dSJason Molenda                         m_items.push_back (item);
178*5e8dce4dSJason Molenda                     }
179*5e8dce4dSJason Molenda                 }
180*5e8dce4dSJason Molenda             }
181*5e8dce4dSJason Molenda         }
182*5e8dce4dSJason Molenda     }
183*5e8dce4dSJason Molenda }
184*5e8dce4dSJason Molenda 
185*5e8dce4dSJason Molenda uint32_t
186*5e8dce4dSJason Molenda SBQueue::GetNumThreads ()
187*5e8dce4dSJason Molenda {
188*5e8dce4dSJason Molenda     uint32_t result = 0;
189*5e8dce4dSJason Molenda 
190*5e8dce4dSJason Molenda     FetchThreads();
191*5e8dce4dSJason Molenda     if (m_thread_list_fetched)
192*5e8dce4dSJason Molenda     {
193*5e8dce4dSJason Molenda         result = m_threads.size();
194*5e8dce4dSJason Molenda     }
195*5e8dce4dSJason Molenda     return result;
196*5e8dce4dSJason Molenda }
197*5e8dce4dSJason Molenda 
198*5e8dce4dSJason Molenda SBThread
199*5e8dce4dSJason Molenda SBQueue::GetThreadAtIndex (uint32_t idx)
200*5e8dce4dSJason Molenda {
201*5e8dce4dSJason Molenda     FetchThreads();
202*5e8dce4dSJason Molenda 
203*5e8dce4dSJason Molenda     SBThread sb_thread;
204*5e8dce4dSJason Molenda     QueueSP queue_sp = m_queue_wp.lock();
205*5e8dce4dSJason Molenda     if (queue_sp && idx < m_threads.size())
206*5e8dce4dSJason Molenda     {
207*5e8dce4dSJason Molenda         ProcessSP process_sp = queue_sp->GetProcess();
208*5e8dce4dSJason Molenda         if (process_sp)
209*5e8dce4dSJason Molenda         {
210*5e8dce4dSJason Molenda             ThreadSP thread_sp = m_threads[idx].lock();
211*5e8dce4dSJason Molenda             if (thread_sp)
212*5e8dce4dSJason Molenda             {
213*5e8dce4dSJason Molenda                 sb_thread.SetThread (thread_sp);
214*5e8dce4dSJason Molenda             }
215*5e8dce4dSJason Molenda         }
216*5e8dce4dSJason Molenda     }
217*5e8dce4dSJason Molenda     return sb_thread;
218*5e8dce4dSJason Molenda }
219*5e8dce4dSJason Molenda 
220*5e8dce4dSJason Molenda 
221*5e8dce4dSJason Molenda uint32_t
222*5e8dce4dSJason Molenda SBQueue::GetNumItems ()
223*5e8dce4dSJason Molenda {
224*5e8dce4dSJason Molenda     uint32_t result = 0;
225*5e8dce4dSJason Molenda     FetchItems();
226*5e8dce4dSJason Molenda 
227*5e8dce4dSJason Molenda     if (m_queue_items_fetched)
228*5e8dce4dSJason Molenda     {
229*5e8dce4dSJason Molenda         result = m_items.size();
230*5e8dce4dSJason Molenda     }
231*5e8dce4dSJason Molenda     return result;
232*5e8dce4dSJason Molenda }
233*5e8dce4dSJason Molenda 
234*5e8dce4dSJason Molenda SBQueueItem
235*5e8dce4dSJason Molenda SBQueue::GetItemAtIndex (uint32_t idx)
236*5e8dce4dSJason Molenda {
237*5e8dce4dSJason Molenda     SBQueueItem result;
238*5e8dce4dSJason Molenda     FetchItems();
239*5e8dce4dSJason Molenda     if (m_queue_items_fetched && idx < m_items.size())
240*5e8dce4dSJason Molenda     {
241*5e8dce4dSJason Molenda         result.SetQueueItem (m_items[idx]);
242*5e8dce4dSJason Molenda     }
243*5e8dce4dSJason Molenda     return result;
244*5e8dce4dSJason Molenda }
245*5e8dce4dSJason Molenda 
246*5e8dce4dSJason Molenda SBProcess
247*5e8dce4dSJason Molenda SBQueue::GetProcess ()
248*5e8dce4dSJason Molenda {
249*5e8dce4dSJason Molenda     SBProcess result;
250*5e8dce4dSJason Molenda     QueueSP queue_sp = m_queue_wp.lock();
251*5e8dce4dSJason Molenda     if (queue_sp)
252*5e8dce4dSJason Molenda     {
253*5e8dce4dSJason Molenda         result.SetSP (queue_sp->GetProcess());
254*5e8dce4dSJason Molenda     }
255*5e8dce4dSJason Molenda     return result;
256*5e8dce4dSJason Molenda }
257