15e8dce4dSJason Molenda //===-- SBQueue.cpp ---------------------------------------------*- C++ -*-===// 25e8dce4dSJason Molenda // 35e8dce4dSJason Molenda // The LLVM Compiler Infrastructure 45e8dce4dSJason Molenda // 55e8dce4dSJason Molenda // This file is distributed under the University of Illinois Open Source 65e8dce4dSJason Molenda // License. See LICENSE.TXT for details. 75e8dce4dSJason Molenda // 85e8dce4dSJason Molenda //===----------------------------------------------------------------------===// 95e8dce4dSJason Molenda 105e8dce4dSJason Molenda #include "lldb/lldb-python.h" 115e8dce4dSJason Molenda 125e8dce4dSJason Molenda #include "lldb/API/SBQueue.h" 135e8dce4dSJason Molenda 145e8dce4dSJason Molenda #include "lldb/API/SBProcess.h" 155e8dce4dSJason Molenda #include "lldb/API/SBThread.h" 165e8dce4dSJason Molenda #include "lldb/Core/Log.h" 175e8dce4dSJason Molenda #include "lldb/Target/Process.h" 185e8dce4dSJason Molenda #include "lldb/Target/Queue.h" 195e8dce4dSJason Molenda #include "lldb/Target/QueueItem.h" 205e8dce4dSJason Molenda #include "lldb/Target/Thread.h" 215e8dce4dSJason Molenda 225e8dce4dSJason Molenda using namespace lldb; 235e8dce4dSJason Molenda using namespace lldb_private; 245e8dce4dSJason Molenda 25c8064ac6SJason Molenda namespace lldb_private 26c8064ac6SJason Molenda { 27c8064ac6SJason Molenda 28c8064ac6SJason Molenda class QueueImpl 29c8064ac6SJason Molenda { 30c8064ac6SJason Molenda public: 31c8064ac6SJason Molenda QueueImpl () : 325e8dce4dSJason Molenda m_queue_wp(), 335e8dce4dSJason Molenda m_threads(), 345e8dce4dSJason Molenda m_thread_list_fetched(false), 355e8dce4dSJason Molenda m_items(), 365e8dce4dSJason Molenda m_queue_items_fetched(false) 375e8dce4dSJason Molenda { 385e8dce4dSJason Molenda } 395e8dce4dSJason Molenda 40c8064ac6SJason Molenda QueueImpl (const lldb::QueueSP &queue_sp) : 41*b97f44d9SJason Molenda m_queue_wp(), 425e8dce4dSJason Molenda m_threads(), 435e8dce4dSJason Molenda m_thread_list_fetched(false), 445e8dce4dSJason Molenda m_items(), 455e8dce4dSJason Molenda m_queue_items_fetched(false) 465e8dce4dSJason Molenda { 47*b97f44d9SJason Molenda m_queue_wp = queue_sp; 485e8dce4dSJason Molenda } 495e8dce4dSJason Molenda 50c8064ac6SJason Molenda QueueImpl (const QueueImpl &rhs) 515e8dce4dSJason Molenda { 52c8064ac6SJason Molenda if (&rhs == this) 53c8064ac6SJason Molenda return; 54c8064ac6SJason Molenda m_queue_wp = rhs.m_queue_wp; 55c8064ac6SJason Molenda m_threads = rhs.m_threads; 56c8064ac6SJason Molenda m_thread_list_fetched = rhs.m_thread_list_fetched; 57c8064ac6SJason Molenda m_items = rhs.m_items; 58c8064ac6SJason Molenda m_queue_items_fetched = rhs.m_queue_items_fetched; 59c8064ac6SJason Molenda } 60c8064ac6SJason Molenda 61c8064ac6SJason Molenda ~QueueImpl () 62c8064ac6SJason Molenda { 635e8dce4dSJason Molenda } 645e8dce4dSJason Molenda 655e8dce4dSJason Molenda bool 66c8064ac6SJason Molenda IsValid () 675e8dce4dSJason Molenda { 68c8064ac6SJason Molenda return m_queue_wp.lock() != NULL; 695e8dce4dSJason Molenda } 705e8dce4dSJason Molenda 715e8dce4dSJason Molenda void 72c8064ac6SJason Molenda Clear () 735e8dce4dSJason Molenda { 745e8dce4dSJason Molenda m_queue_wp.reset(); 755e8dce4dSJason Molenda m_thread_list_fetched = false; 765e8dce4dSJason Molenda m_threads.clear(); 775e8dce4dSJason Molenda m_queue_items_fetched = false; 785e8dce4dSJason Molenda m_items.clear(); 795e8dce4dSJason Molenda } 805e8dce4dSJason Molenda 815e8dce4dSJason Molenda void 82c8064ac6SJason Molenda SetQueue (const lldb::QueueSP &queue_sp) 835e8dce4dSJason Molenda { 84c8064ac6SJason Molenda Clear(); 855e8dce4dSJason Molenda m_queue_wp = queue_sp; 865e8dce4dSJason Molenda } 875e8dce4dSJason Molenda 885e8dce4dSJason Molenda lldb::queue_id_t 89c8064ac6SJason Molenda GetQueueID () const 905e8dce4dSJason Molenda { 91c8064ac6SJason Molenda lldb::queue_id_t result = LLDB_INVALID_QUEUE_ID; 92c8064ac6SJason Molenda lldb::QueueSP queue_sp = m_queue_wp.lock(); 935e8dce4dSJason Molenda if (queue_sp) 945e8dce4dSJason Molenda { 955e8dce4dSJason Molenda result = queue_sp->GetID(); 965e8dce4dSJason Molenda } 975e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 985e8dce4dSJason Molenda if (log) 995e8dce4dSJason Molenda log->Printf ("SBQueue(%p)::GetQueueID () => 0x%" PRIx64, this, result); 1005e8dce4dSJason Molenda return result; 1015e8dce4dSJason Molenda } 1025e8dce4dSJason Molenda 1035e8dce4dSJason Molenda uint32_t 104c8064ac6SJason Molenda GetIndexID () const 1055e8dce4dSJason Molenda { 1065e8dce4dSJason Molenda uint32_t result = LLDB_INVALID_INDEX32; 107c8064ac6SJason Molenda lldb::QueueSP queue_sp = m_queue_wp.lock(); 1085e8dce4dSJason Molenda if (queue_sp) 1095e8dce4dSJason Molenda { 1105e8dce4dSJason Molenda result = queue_sp->GetIndexID(); 1115e8dce4dSJason Molenda } 1125e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1135e8dce4dSJason Molenda if (log) 114c8064ac6SJason Molenda log->Printf ("SBQueueImpl(%p)::GetIndexID () => %d", this, result); 1155e8dce4dSJason Molenda return result; 1165e8dce4dSJason Molenda } 1175e8dce4dSJason Molenda 1185e8dce4dSJason Molenda const char * 119c8064ac6SJason Molenda GetName () const 1205e8dce4dSJason Molenda { 1215e8dce4dSJason Molenda const char *name = NULL; 122c8064ac6SJason Molenda lldb::QueueSP queue_sp = m_queue_wp.lock (); 1235e8dce4dSJason Molenda if (queue_sp.get()) 1245e8dce4dSJason Molenda { 1255e8dce4dSJason Molenda name = queue_sp->GetName(); 1265e8dce4dSJason Molenda } 1275e8dce4dSJason Molenda 1285e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1295e8dce4dSJason Molenda if (log) 130c8064ac6SJason Molenda log->Printf ("SBQueueImpl(%p)::GetName () => %s", this, name ? name : "NULL"); 1315e8dce4dSJason Molenda 1325e8dce4dSJason Molenda return name; 1335e8dce4dSJason Molenda } 1345e8dce4dSJason Molenda 1355e8dce4dSJason Molenda void 136c8064ac6SJason Molenda FetchThreads () 1375e8dce4dSJason Molenda { 1385e8dce4dSJason Molenda if (m_thread_list_fetched == false) 1395e8dce4dSJason Molenda { 140c8064ac6SJason Molenda lldb::QueueSP queue_sp = m_queue_wp.lock(); 1415e8dce4dSJason Molenda if (queue_sp) 1425e8dce4dSJason Molenda { 1435e8dce4dSJason Molenda Process::StopLocker stop_locker; 1445e8dce4dSJason Molenda if (stop_locker.TryLock (&queue_sp->GetProcess()->GetRunLock())) 1455e8dce4dSJason Molenda { 1465e8dce4dSJason Molenda const std::vector<ThreadSP> thread_list(queue_sp->GetThreads()); 1475e8dce4dSJason Molenda m_thread_list_fetched = true; 1485e8dce4dSJason Molenda const uint32_t num_threads = thread_list.size(); 1495e8dce4dSJason Molenda for (uint32_t idx = 0; idx < num_threads; ++idx) 1505e8dce4dSJason Molenda { 1515e8dce4dSJason Molenda ThreadSP thread_sp = thread_list[idx]; 1525e8dce4dSJason Molenda if (thread_sp && thread_sp->IsValid()) 1535e8dce4dSJason Molenda { 1545e8dce4dSJason Molenda m_threads.push_back (thread_sp); 1555e8dce4dSJason Molenda } 1565e8dce4dSJason Molenda } 1575e8dce4dSJason Molenda } 1585e8dce4dSJason Molenda } 1595e8dce4dSJason Molenda } 1605e8dce4dSJason Molenda } 1615e8dce4dSJason Molenda 1625e8dce4dSJason Molenda void 163c8064ac6SJason Molenda FetchItems () 1645e8dce4dSJason Molenda { 1655e8dce4dSJason Molenda if (m_queue_items_fetched == false) 1665e8dce4dSJason Molenda { 1675e8dce4dSJason Molenda QueueSP queue_sp = m_queue_wp.lock(); 1685e8dce4dSJason Molenda if (queue_sp) 1695e8dce4dSJason Molenda { 1705e8dce4dSJason Molenda Process::StopLocker stop_locker; 1715e8dce4dSJason Molenda if (stop_locker.TryLock (&queue_sp->GetProcess()->GetRunLock())) 1725e8dce4dSJason Molenda { 1735e8dce4dSJason Molenda const std::vector<QueueItemSP> queue_items(queue_sp->GetItems()); 1745e8dce4dSJason Molenda m_queue_items_fetched = true; 1755e8dce4dSJason Molenda const uint32_t num_items = queue_items.size(); 1765e8dce4dSJason Molenda for (uint32_t idx = 0; idx < num_items; ++idx) 1775e8dce4dSJason Molenda { 1785e8dce4dSJason Molenda QueueItemSP item = queue_items[idx]; 1795e8dce4dSJason Molenda if (item && item->IsValid()) 1805e8dce4dSJason Molenda { 1815e8dce4dSJason Molenda m_items.push_back (item); 1825e8dce4dSJason Molenda } 1835e8dce4dSJason Molenda } 1845e8dce4dSJason Molenda } 1855e8dce4dSJason Molenda } 1865e8dce4dSJason Molenda } 1875e8dce4dSJason Molenda } 1885e8dce4dSJason Molenda 1895e8dce4dSJason Molenda uint32_t 190c8064ac6SJason Molenda GetNumThreads () 1915e8dce4dSJason Molenda { 1925e8dce4dSJason Molenda uint32_t result = 0; 1935e8dce4dSJason Molenda 1945e8dce4dSJason Molenda FetchThreads(); 1955e8dce4dSJason Molenda if (m_thread_list_fetched) 1965e8dce4dSJason Molenda { 1975e8dce4dSJason Molenda result = m_threads.size(); 1985e8dce4dSJason Molenda } 1995e8dce4dSJason Molenda return result; 2005e8dce4dSJason Molenda } 2015e8dce4dSJason Molenda 202c8064ac6SJason Molenda lldb::SBThread 203c8064ac6SJason Molenda GetThreadAtIndex (uint32_t idx) 2045e8dce4dSJason Molenda { 2055e8dce4dSJason Molenda FetchThreads(); 2065e8dce4dSJason Molenda 2075e8dce4dSJason Molenda SBThread sb_thread; 2085e8dce4dSJason Molenda QueueSP queue_sp = m_queue_wp.lock(); 2095e8dce4dSJason Molenda if (queue_sp && idx < m_threads.size()) 2105e8dce4dSJason Molenda { 2115e8dce4dSJason Molenda ProcessSP process_sp = queue_sp->GetProcess(); 2125e8dce4dSJason Molenda if (process_sp) 2135e8dce4dSJason Molenda { 2145e8dce4dSJason Molenda ThreadSP thread_sp = m_threads[idx].lock(); 2155e8dce4dSJason Molenda if (thread_sp) 2165e8dce4dSJason Molenda { 2175e8dce4dSJason Molenda sb_thread.SetThread (thread_sp); 2185e8dce4dSJason Molenda } 2195e8dce4dSJason Molenda } 2205e8dce4dSJason Molenda } 2215e8dce4dSJason Molenda return sb_thread; 2225e8dce4dSJason Molenda } 2235e8dce4dSJason Molenda 2245e8dce4dSJason Molenda 2255e8dce4dSJason Molenda uint32_t 226c8064ac6SJason Molenda GetNumItems () 2275e8dce4dSJason Molenda { 2285e8dce4dSJason Molenda uint32_t result = 0; 2295e8dce4dSJason Molenda FetchItems(); 2305e8dce4dSJason Molenda 2315e8dce4dSJason Molenda if (m_queue_items_fetched) 2325e8dce4dSJason Molenda { 2335e8dce4dSJason Molenda result = m_items.size(); 2345e8dce4dSJason Molenda } 2355e8dce4dSJason Molenda return result; 2365e8dce4dSJason Molenda } 2375e8dce4dSJason Molenda 238c8064ac6SJason Molenda lldb::SBQueueItem 239c8064ac6SJason Molenda GetItemAtIndex (uint32_t idx) 2405e8dce4dSJason Molenda { 2415e8dce4dSJason Molenda SBQueueItem result; 2425e8dce4dSJason Molenda FetchItems(); 2435e8dce4dSJason Molenda if (m_queue_items_fetched && idx < m_items.size()) 2445e8dce4dSJason Molenda { 2455e8dce4dSJason Molenda result.SetQueueItem (m_items[idx]); 2465e8dce4dSJason Molenda } 2475e8dce4dSJason Molenda return result; 2485e8dce4dSJason Molenda } 2495e8dce4dSJason Molenda 250c8064ac6SJason Molenda lldb::SBProcess 251c8064ac6SJason Molenda GetProcess () 2525e8dce4dSJason Molenda { 2535e8dce4dSJason Molenda SBProcess result; 2545e8dce4dSJason Molenda QueueSP queue_sp = m_queue_wp.lock(); 2555e8dce4dSJason Molenda if (queue_sp) 2565e8dce4dSJason Molenda { 2575e8dce4dSJason Molenda result.SetSP (queue_sp->GetProcess()); 2585e8dce4dSJason Molenda } 2595e8dce4dSJason Molenda return result; 2605e8dce4dSJason Molenda } 261c8064ac6SJason Molenda 262c8064ac6SJason Molenda private: 263c8064ac6SJason Molenda lldb::QueueWP m_queue_wp; 264c8064ac6SJason Molenda std::vector<lldb::ThreadWP> m_threads; // threads currently executing this queue's items 265c8064ac6SJason Molenda bool m_thread_list_fetched; // have we tried to fetch the threads list already? 266c8064ac6SJason Molenda std::vector<lldb::QueueItemSP> m_items; // items currently enqueued 267c8064ac6SJason Molenda bool m_queue_items_fetched; // have we tried to fetch the item list already? 268c8064ac6SJason Molenda }; 269c8064ac6SJason Molenda 270c8064ac6SJason Molenda } 271c8064ac6SJason Molenda 272c8064ac6SJason Molenda SBQueue::SBQueue () : 273c8064ac6SJason Molenda m_opaque_sp (new QueueImpl()) 274c8064ac6SJason Molenda { 275c8064ac6SJason Molenda } 276c8064ac6SJason Molenda 277c8064ac6SJason Molenda SBQueue::SBQueue (const QueueSP& queue_sp) : 278c8064ac6SJason Molenda m_opaque_sp (new QueueImpl (queue_sp)) 279c8064ac6SJason Molenda { 280c8064ac6SJason Molenda } 281c8064ac6SJason Molenda 282c8064ac6SJason Molenda SBQueue::SBQueue (const SBQueue &rhs) 283c8064ac6SJason Molenda { 284c8064ac6SJason Molenda if (&rhs == this) 285c8064ac6SJason Molenda return; 286c8064ac6SJason Molenda 287c8064ac6SJason Molenda m_opaque_sp = rhs.m_opaque_sp; 288c8064ac6SJason Molenda } 289c8064ac6SJason Molenda 290c8064ac6SJason Molenda const lldb::SBQueue & 291c8064ac6SJason Molenda SBQueue::operator = (const lldb::SBQueue &rhs) 292c8064ac6SJason Molenda { 293c8064ac6SJason Molenda m_opaque_sp = rhs.m_opaque_sp; 294c8064ac6SJason Molenda return *this; 295c8064ac6SJason Molenda } 296c8064ac6SJason Molenda 297c8064ac6SJason Molenda SBQueue::~SBQueue() 298c8064ac6SJason Molenda { 299c8064ac6SJason Molenda } 300c8064ac6SJason Molenda 301c8064ac6SJason Molenda bool 302c8064ac6SJason Molenda SBQueue::IsValid() const 303c8064ac6SJason Molenda { 304c8064ac6SJason Molenda return m_opaque_sp->IsValid(); 305c8064ac6SJason Molenda } 306c8064ac6SJason Molenda 307c8064ac6SJason Molenda 308c8064ac6SJason Molenda void 309c8064ac6SJason Molenda SBQueue::Clear () 310c8064ac6SJason Molenda { 311c8064ac6SJason Molenda m_opaque_sp->Clear(); 312c8064ac6SJason Molenda } 313c8064ac6SJason Molenda 314c8064ac6SJason Molenda 315c8064ac6SJason Molenda void 316c8064ac6SJason Molenda SBQueue::SetQueue (const QueueSP& queue_sp) 317c8064ac6SJason Molenda { 318c8064ac6SJason Molenda m_opaque_sp->SetQueue (queue_sp); 319c8064ac6SJason Molenda } 320c8064ac6SJason Molenda 321c8064ac6SJason Molenda lldb::queue_id_t 322c8064ac6SJason Molenda SBQueue::GetQueueID () const 323c8064ac6SJason Molenda { 324c8064ac6SJason Molenda return m_opaque_sp->GetQueueID (); 325c8064ac6SJason Molenda } 326c8064ac6SJason Molenda 327c8064ac6SJason Molenda uint32_t 328c8064ac6SJason Molenda SBQueue::GetIndexID () const 329c8064ac6SJason Molenda { 330c8064ac6SJason Molenda return m_opaque_sp->GetIndexID (); 331c8064ac6SJason Molenda } 332c8064ac6SJason Molenda 333c8064ac6SJason Molenda const char * 334c8064ac6SJason Molenda SBQueue::GetName () const 335c8064ac6SJason Molenda { 336c8064ac6SJason Molenda return m_opaque_sp->GetName (); 337c8064ac6SJason Molenda } 338c8064ac6SJason Molenda 339c8064ac6SJason Molenda uint32_t 340c8064ac6SJason Molenda SBQueue::GetNumThreads () 341c8064ac6SJason Molenda { 342c8064ac6SJason Molenda return m_opaque_sp->GetNumThreads (); 343c8064ac6SJason Molenda } 344c8064ac6SJason Molenda 345c8064ac6SJason Molenda SBThread 346c8064ac6SJason Molenda SBQueue::GetThreadAtIndex (uint32_t idx) 347c8064ac6SJason Molenda { 348c8064ac6SJason Molenda return m_opaque_sp->GetThreadAtIndex (idx); 349c8064ac6SJason Molenda } 350c8064ac6SJason Molenda 351c8064ac6SJason Molenda 352c8064ac6SJason Molenda uint32_t 353c8064ac6SJason Molenda SBQueue::GetNumItems () 354c8064ac6SJason Molenda { 355c8064ac6SJason Molenda return m_opaque_sp->GetNumItems (); 356c8064ac6SJason Molenda } 357c8064ac6SJason Molenda 358c8064ac6SJason Molenda SBQueueItem 359c8064ac6SJason Molenda SBQueue::GetItemAtIndex (uint32_t idx) 360c8064ac6SJason Molenda { 361c8064ac6SJason Molenda return m_opaque_sp->GetItemAtIndex (idx); 362c8064ac6SJason Molenda } 363c8064ac6SJason Molenda 364c8064ac6SJason Molenda SBProcess 365c8064ac6SJason Molenda SBQueue::GetProcess () 366c8064ac6SJason Molenda { 367c8064ac6SJason Molenda return m_opaque_sp->GetProcess(); 368c8064ac6SJason Molenda } 369