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