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 25*c8064ac6SJason Molenda namespace lldb_private 26*c8064ac6SJason Molenda { 27*c8064ac6SJason Molenda 28*c8064ac6SJason Molenda class QueueImpl 29*c8064ac6SJason Molenda { 30*c8064ac6SJason Molenda public: 31*c8064ac6SJason 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 40*c8064ac6SJason Molenda QueueImpl (const lldb::QueueSP &queue_sp) : 415e8dce4dSJason Molenda m_queue_wp(queue_sp), 425e8dce4dSJason Molenda m_threads(), 435e8dce4dSJason Molenda m_thread_list_fetched(false), 445e8dce4dSJason Molenda m_items(), 455e8dce4dSJason Molenda m_queue_items_fetched(false) 465e8dce4dSJason Molenda { 475e8dce4dSJason Molenda } 485e8dce4dSJason Molenda 49*c8064ac6SJason Molenda QueueImpl (const QueueImpl &rhs) 505e8dce4dSJason Molenda { 51*c8064ac6SJason Molenda if (&rhs == this) 52*c8064ac6SJason Molenda return; 53*c8064ac6SJason Molenda m_queue_wp = rhs.m_queue_wp; 54*c8064ac6SJason Molenda m_threads = rhs.m_threads; 55*c8064ac6SJason Molenda m_thread_list_fetched = rhs.m_thread_list_fetched; 56*c8064ac6SJason Molenda m_items = rhs.m_items; 57*c8064ac6SJason Molenda m_queue_items_fetched = rhs.m_queue_items_fetched; 58*c8064ac6SJason Molenda } 59*c8064ac6SJason Molenda 60*c8064ac6SJason Molenda ~QueueImpl () 61*c8064ac6SJason Molenda { 625e8dce4dSJason Molenda } 635e8dce4dSJason Molenda 645e8dce4dSJason Molenda bool 65*c8064ac6SJason Molenda IsValid () 665e8dce4dSJason Molenda { 67*c8064ac6SJason Molenda return m_queue_wp.lock() != NULL; 685e8dce4dSJason Molenda } 695e8dce4dSJason Molenda 705e8dce4dSJason Molenda void 71*c8064ac6SJason Molenda Clear () 725e8dce4dSJason Molenda { 735e8dce4dSJason Molenda m_queue_wp.reset(); 745e8dce4dSJason Molenda m_thread_list_fetched = false; 755e8dce4dSJason Molenda m_threads.clear(); 765e8dce4dSJason Molenda m_queue_items_fetched = false; 775e8dce4dSJason Molenda m_items.clear(); 785e8dce4dSJason Molenda } 795e8dce4dSJason Molenda 805e8dce4dSJason Molenda void 81*c8064ac6SJason Molenda SetQueue (const lldb::QueueSP &queue_sp) 825e8dce4dSJason Molenda { 83*c8064ac6SJason Molenda Clear(); 845e8dce4dSJason Molenda m_queue_wp = queue_sp; 855e8dce4dSJason Molenda } 865e8dce4dSJason Molenda 875e8dce4dSJason Molenda lldb::queue_id_t 88*c8064ac6SJason Molenda GetQueueID () const 895e8dce4dSJason Molenda { 90*c8064ac6SJason Molenda lldb::queue_id_t result = LLDB_INVALID_QUEUE_ID; 91*c8064ac6SJason Molenda lldb::QueueSP queue_sp = m_queue_wp.lock(); 925e8dce4dSJason Molenda if (queue_sp) 935e8dce4dSJason Molenda { 945e8dce4dSJason Molenda result = queue_sp->GetID(); 955e8dce4dSJason Molenda } 965e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 975e8dce4dSJason Molenda if (log) 985e8dce4dSJason Molenda log->Printf ("SBQueue(%p)::GetQueueID () => 0x%" PRIx64, this, result); 995e8dce4dSJason Molenda return result; 1005e8dce4dSJason Molenda } 1015e8dce4dSJason Molenda 1025e8dce4dSJason Molenda uint32_t 103*c8064ac6SJason Molenda GetIndexID () const 1045e8dce4dSJason Molenda { 1055e8dce4dSJason Molenda uint32_t result = LLDB_INVALID_INDEX32; 106*c8064ac6SJason Molenda lldb::QueueSP queue_sp = m_queue_wp.lock(); 1075e8dce4dSJason Molenda if (queue_sp) 1085e8dce4dSJason Molenda { 1095e8dce4dSJason Molenda result = queue_sp->GetIndexID(); 1105e8dce4dSJason Molenda } 1115e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1125e8dce4dSJason Molenda if (log) 113*c8064ac6SJason Molenda log->Printf ("SBQueueImpl(%p)::GetIndexID () => %d", this, result); 1145e8dce4dSJason Molenda return result; 1155e8dce4dSJason Molenda } 1165e8dce4dSJason Molenda 1175e8dce4dSJason Molenda const char * 118*c8064ac6SJason Molenda GetName () const 1195e8dce4dSJason Molenda { 1205e8dce4dSJason Molenda const char *name = NULL; 121*c8064ac6SJason Molenda lldb::QueueSP queue_sp = m_queue_wp.lock (); 1225e8dce4dSJason Molenda if (queue_sp.get()) 1235e8dce4dSJason Molenda { 1245e8dce4dSJason Molenda name = queue_sp->GetName(); 1255e8dce4dSJason Molenda } 1265e8dce4dSJason Molenda 1275e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1285e8dce4dSJason Molenda if (log) 129*c8064ac6SJason Molenda log->Printf ("SBQueueImpl(%p)::GetName () => %s", this, name ? name : "NULL"); 1305e8dce4dSJason Molenda 1315e8dce4dSJason Molenda return name; 1325e8dce4dSJason Molenda } 1335e8dce4dSJason Molenda 1345e8dce4dSJason Molenda void 135*c8064ac6SJason Molenda FetchThreads () 1365e8dce4dSJason Molenda { 1375e8dce4dSJason Molenda if (m_thread_list_fetched == false) 1385e8dce4dSJason Molenda { 139*c8064ac6SJason Molenda lldb::QueueSP queue_sp = m_queue_wp.lock(); 1405e8dce4dSJason Molenda if (queue_sp) 1415e8dce4dSJason Molenda { 1425e8dce4dSJason Molenda Process::StopLocker stop_locker; 1435e8dce4dSJason Molenda if (stop_locker.TryLock (&queue_sp->GetProcess()->GetRunLock())) 1445e8dce4dSJason Molenda { 1455e8dce4dSJason Molenda const std::vector<ThreadSP> thread_list(queue_sp->GetThreads()); 1465e8dce4dSJason Molenda m_thread_list_fetched = true; 1475e8dce4dSJason Molenda const uint32_t num_threads = thread_list.size(); 1485e8dce4dSJason Molenda for (uint32_t idx = 0; idx < num_threads; ++idx) 1495e8dce4dSJason Molenda { 1505e8dce4dSJason Molenda ThreadSP thread_sp = thread_list[idx]; 1515e8dce4dSJason Molenda if (thread_sp && thread_sp->IsValid()) 1525e8dce4dSJason Molenda { 1535e8dce4dSJason Molenda m_threads.push_back (thread_sp); 1545e8dce4dSJason Molenda } 1555e8dce4dSJason Molenda } 1565e8dce4dSJason Molenda } 1575e8dce4dSJason Molenda } 1585e8dce4dSJason Molenda } 1595e8dce4dSJason Molenda } 1605e8dce4dSJason Molenda 1615e8dce4dSJason Molenda void 162*c8064ac6SJason Molenda FetchItems () 1635e8dce4dSJason Molenda { 1645e8dce4dSJason Molenda if (m_queue_items_fetched == false) 1655e8dce4dSJason Molenda { 1665e8dce4dSJason Molenda QueueSP queue_sp = m_queue_wp.lock(); 1675e8dce4dSJason Molenda if (queue_sp) 1685e8dce4dSJason Molenda { 1695e8dce4dSJason Molenda Process::StopLocker stop_locker; 1705e8dce4dSJason Molenda if (stop_locker.TryLock (&queue_sp->GetProcess()->GetRunLock())) 1715e8dce4dSJason Molenda { 1725e8dce4dSJason Molenda const std::vector<QueueItemSP> queue_items(queue_sp->GetItems()); 1735e8dce4dSJason Molenda m_queue_items_fetched = true; 1745e8dce4dSJason Molenda const uint32_t num_items = queue_items.size(); 1755e8dce4dSJason Molenda for (uint32_t idx = 0; idx < num_items; ++idx) 1765e8dce4dSJason Molenda { 1775e8dce4dSJason Molenda QueueItemSP item = queue_items[idx]; 1785e8dce4dSJason Molenda if (item && item->IsValid()) 1795e8dce4dSJason Molenda { 1805e8dce4dSJason Molenda m_items.push_back (item); 1815e8dce4dSJason Molenda } 1825e8dce4dSJason Molenda } 1835e8dce4dSJason Molenda } 1845e8dce4dSJason Molenda } 1855e8dce4dSJason Molenda } 1865e8dce4dSJason Molenda } 1875e8dce4dSJason Molenda 1885e8dce4dSJason Molenda uint32_t 189*c8064ac6SJason Molenda GetNumThreads () 1905e8dce4dSJason Molenda { 1915e8dce4dSJason Molenda uint32_t result = 0; 1925e8dce4dSJason Molenda 1935e8dce4dSJason Molenda FetchThreads(); 1945e8dce4dSJason Molenda if (m_thread_list_fetched) 1955e8dce4dSJason Molenda { 1965e8dce4dSJason Molenda result = m_threads.size(); 1975e8dce4dSJason Molenda } 1985e8dce4dSJason Molenda return result; 1995e8dce4dSJason Molenda } 2005e8dce4dSJason Molenda 201*c8064ac6SJason Molenda lldb::SBThread 202*c8064ac6SJason Molenda GetThreadAtIndex (uint32_t idx) 2035e8dce4dSJason Molenda { 2045e8dce4dSJason Molenda FetchThreads(); 2055e8dce4dSJason Molenda 2065e8dce4dSJason Molenda SBThread sb_thread; 2075e8dce4dSJason Molenda QueueSP queue_sp = m_queue_wp.lock(); 2085e8dce4dSJason Molenda if (queue_sp && idx < m_threads.size()) 2095e8dce4dSJason Molenda { 2105e8dce4dSJason Molenda ProcessSP process_sp = queue_sp->GetProcess(); 2115e8dce4dSJason Molenda if (process_sp) 2125e8dce4dSJason Molenda { 2135e8dce4dSJason Molenda ThreadSP thread_sp = m_threads[idx].lock(); 2145e8dce4dSJason Molenda if (thread_sp) 2155e8dce4dSJason Molenda { 2165e8dce4dSJason Molenda sb_thread.SetThread (thread_sp); 2175e8dce4dSJason Molenda } 2185e8dce4dSJason Molenda } 2195e8dce4dSJason Molenda } 2205e8dce4dSJason Molenda return sb_thread; 2215e8dce4dSJason Molenda } 2225e8dce4dSJason Molenda 2235e8dce4dSJason Molenda 2245e8dce4dSJason Molenda uint32_t 225*c8064ac6SJason Molenda GetNumItems () 2265e8dce4dSJason Molenda { 2275e8dce4dSJason Molenda uint32_t result = 0; 2285e8dce4dSJason Molenda FetchItems(); 2295e8dce4dSJason Molenda 2305e8dce4dSJason Molenda if (m_queue_items_fetched) 2315e8dce4dSJason Molenda { 2325e8dce4dSJason Molenda result = m_items.size(); 2335e8dce4dSJason Molenda } 2345e8dce4dSJason Molenda return result; 2355e8dce4dSJason Molenda } 2365e8dce4dSJason Molenda 237*c8064ac6SJason Molenda lldb::SBQueueItem 238*c8064ac6SJason Molenda GetItemAtIndex (uint32_t idx) 2395e8dce4dSJason Molenda { 2405e8dce4dSJason Molenda SBQueueItem result; 2415e8dce4dSJason Molenda FetchItems(); 2425e8dce4dSJason Molenda if (m_queue_items_fetched && idx < m_items.size()) 2435e8dce4dSJason Molenda { 2445e8dce4dSJason Molenda result.SetQueueItem (m_items[idx]); 2455e8dce4dSJason Molenda } 2465e8dce4dSJason Molenda return result; 2475e8dce4dSJason Molenda } 2485e8dce4dSJason Molenda 249*c8064ac6SJason Molenda lldb::SBProcess 250*c8064ac6SJason Molenda GetProcess () 2515e8dce4dSJason Molenda { 2525e8dce4dSJason Molenda SBProcess result; 2535e8dce4dSJason Molenda QueueSP queue_sp = m_queue_wp.lock(); 2545e8dce4dSJason Molenda if (queue_sp) 2555e8dce4dSJason Molenda { 2565e8dce4dSJason Molenda result.SetSP (queue_sp->GetProcess()); 2575e8dce4dSJason Molenda } 2585e8dce4dSJason Molenda return result; 2595e8dce4dSJason Molenda } 260*c8064ac6SJason Molenda 261*c8064ac6SJason Molenda private: 262*c8064ac6SJason Molenda lldb::QueueWP m_queue_wp; 263*c8064ac6SJason Molenda std::vector<lldb::ThreadWP> m_threads; // threads currently executing this queue's items 264*c8064ac6SJason Molenda bool m_thread_list_fetched; // have we tried to fetch the threads list already? 265*c8064ac6SJason Molenda std::vector<lldb::QueueItemSP> m_items; // items currently enqueued 266*c8064ac6SJason Molenda bool m_queue_items_fetched; // have we tried to fetch the item list already? 267*c8064ac6SJason Molenda }; 268*c8064ac6SJason Molenda 269*c8064ac6SJason Molenda } 270*c8064ac6SJason Molenda 271*c8064ac6SJason Molenda SBQueue::SBQueue () : 272*c8064ac6SJason Molenda m_opaque_sp (new QueueImpl()) 273*c8064ac6SJason Molenda { 274*c8064ac6SJason Molenda } 275*c8064ac6SJason Molenda 276*c8064ac6SJason Molenda SBQueue::SBQueue (const QueueSP& queue_sp) : 277*c8064ac6SJason Molenda m_opaque_sp (new QueueImpl (queue_sp)) 278*c8064ac6SJason Molenda { 279*c8064ac6SJason Molenda } 280*c8064ac6SJason Molenda 281*c8064ac6SJason Molenda SBQueue::SBQueue (const SBQueue &rhs) 282*c8064ac6SJason Molenda { 283*c8064ac6SJason Molenda if (&rhs == this) 284*c8064ac6SJason Molenda return; 285*c8064ac6SJason Molenda 286*c8064ac6SJason Molenda m_opaque_sp = rhs.m_opaque_sp; 287*c8064ac6SJason Molenda } 288*c8064ac6SJason Molenda 289*c8064ac6SJason Molenda const lldb::SBQueue & 290*c8064ac6SJason Molenda SBQueue::operator = (const lldb::SBQueue &rhs) 291*c8064ac6SJason Molenda { 292*c8064ac6SJason Molenda m_opaque_sp = rhs.m_opaque_sp; 293*c8064ac6SJason Molenda return *this; 294*c8064ac6SJason Molenda } 295*c8064ac6SJason Molenda 296*c8064ac6SJason Molenda SBQueue::~SBQueue() 297*c8064ac6SJason Molenda { 298*c8064ac6SJason Molenda } 299*c8064ac6SJason Molenda 300*c8064ac6SJason Molenda bool 301*c8064ac6SJason Molenda SBQueue::IsValid() const 302*c8064ac6SJason Molenda { 303*c8064ac6SJason Molenda return m_opaque_sp->IsValid(); 304*c8064ac6SJason Molenda } 305*c8064ac6SJason Molenda 306*c8064ac6SJason Molenda 307*c8064ac6SJason Molenda void 308*c8064ac6SJason Molenda SBQueue::Clear () 309*c8064ac6SJason Molenda { 310*c8064ac6SJason Molenda m_opaque_sp->Clear(); 311*c8064ac6SJason Molenda } 312*c8064ac6SJason Molenda 313*c8064ac6SJason Molenda 314*c8064ac6SJason Molenda void 315*c8064ac6SJason Molenda SBQueue::SetQueue (const QueueSP& queue_sp) 316*c8064ac6SJason Molenda { 317*c8064ac6SJason Molenda m_opaque_sp->SetQueue (queue_sp); 318*c8064ac6SJason Molenda } 319*c8064ac6SJason Molenda 320*c8064ac6SJason Molenda lldb::queue_id_t 321*c8064ac6SJason Molenda SBQueue::GetQueueID () const 322*c8064ac6SJason Molenda { 323*c8064ac6SJason Molenda return m_opaque_sp->GetQueueID (); 324*c8064ac6SJason Molenda } 325*c8064ac6SJason Molenda 326*c8064ac6SJason Molenda uint32_t 327*c8064ac6SJason Molenda SBQueue::GetIndexID () const 328*c8064ac6SJason Molenda { 329*c8064ac6SJason Molenda return m_opaque_sp->GetIndexID (); 330*c8064ac6SJason Molenda } 331*c8064ac6SJason Molenda 332*c8064ac6SJason Molenda const char * 333*c8064ac6SJason Molenda SBQueue::GetName () const 334*c8064ac6SJason Molenda { 335*c8064ac6SJason Molenda return m_opaque_sp->GetName (); 336*c8064ac6SJason Molenda } 337*c8064ac6SJason Molenda 338*c8064ac6SJason Molenda uint32_t 339*c8064ac6SJason Molenda SBQueue::GetNumThreads () 340*c8064ac6SJason Molenda { 341*c8064ac6SJason Molenda return m_opaque_sp->GetNumThreads (); 342*c8064ac6SJason Molenda } 343*c8064ac6SJason Molenda 344*c8064ac6SJason Molenda SBThread 345*c8064ac6SJason Molenda SBQueue::GetThreadAtIndex (uint32_t idx) 346*c8064ac6SJason Molenda { 347*c8064ac6SJason Molenda return m_opaque_sp->GetThreadAtIndex (idx); 348*c8064ac6SJason Molenda } 349*c8064ac6SJason Molenda 350*c8064ac6SJason Molenda 351*c8064ac6SJason Molenda uint32_t 352*c8064ac6SJason Molenda SBQueue::GetNumItems () 353*c8064ac6SJason Molenda { 354*c8064ac6SJason Molenda return m_opaque_sp->GetNumItems (); 355*c8064ac6SJason Molenda } 356*c8064ac6SJason Molenda 357*c8064ac6SJason Molenda SBQueueItem 358*c8064ac6SJason Molenda SBQueue::GetItemAtIndex (uint32_t idx) 359*c8064ac6SJason Molenda { 360*c8064ac6SJason Molenda return m_opaque_sp->GetItemAtIndex (idx); 361*c8064ac6SJason Molenda } 362*c8064ac6SJason Molenda 363*c8064ac6SJason Molenda SBProcess 364*c8064ac6SJason Molenda SBQueue::GetProcess () 365*c8064ac6SJason Molenda { 366*c8064ac6SJason Molenda return m_opaque_sp->GetProcess(); 367*c8064ac6SJason Molenda } 368