15e8dce4dSJason Molenda //===-- Queue.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/Target/Process.h" 115e8dce4dSJason Molenda #include "lldb/Target/Queue.h" 125e8dce4dSJason Molenda #include "lldb/Target/QueueList.h" 135e8dce4dSJason Molenda #include "lldb/Target/Thread.h" 14*2fd83355SJason Molenda #include "lldb/Target/SystemRuntime.h" 155e8dce4dSJason Molenda 165e8dce4dSJason Molenda using namespace lldb; 175e8dce4dSJason Molenda using namespace lldb_private; 185e8dce4dSJason Molenda 195e8dce4dSJason Molenda Queue::Queue (ProcessSP process_sp, lldb::queue_id_t queue_id, const char *queue_name) : 20b97f44d9SJason Molenda m_process_wp (), 215e8dce4dSJason Molenda m_queue_id (queue_id), 224a5ec88fSJason Molenda m_queue_name (), 23*2fd83355SJason Molenda m_running_work_items_count(0), 24*2fd83355SJason Molenda m_pending_work_items_count(0), 25*2fd83355SJason Molenda m_pending_items(), 26*2fd83355SJason Molenda m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS) 275e8dce4dSJason Molenda { 284a5ec88fSJason Molenda if (queue_name) 294a5ec88fSJason Molenda m_queue_name = queue_name; 304a5ec88fSJason Molenda 31b97f44d9SJason Molenda m_process_wp = process_sp; 325e8dce4dSJason Molenda } 335e8dce4dSJason Molenda 345e8dce4dSJason Molenda Queue::~Queue () 355e8dce4dSJason Molenda { 365e8dce4dSJason Molenda } 375e8dce4dSJason Molenda 385e8dce4dSJason Molenda queue_id_t 395e8dce4dSJason Molenda Queue::GetID () 405e8dce4dSJason Molenda { 415e8dce4dSJason Molenda return m_queue_id; 425e8dce4dSJason Molenda } 435e8dce4dSJason Molenda 445e8dce4dSJason Molenda const char * 455e8dce4dSJason Molenda Queue::GetName () 465e8dce4dSJason Molenda { 475e8dce4dSJason Molenda const char *result = NULL; 485e8dce4dSJason Molenda if (m_queue_name.size() > 0) 495e8dce4dSJason Molenda result = m_queue_name.c_str(); 505e8dce4dSJason Molenda return result; 515e8dce4dSJason Molenda } 525e8dce4dSJason Molenda 535e8dce4dSJason Molenda uint32_t 545e8dce4dSJason Molenda Queue::GetIndexID () 555e8dce4dSJason Molenda { 56*2fd83355SJason Molenda return m_queue_id; 575e8dce4dSJason Molenda } 585e8dce4dSJason Molenda 595e8dce4dSJason Molenda std::vector<lldb::ThreadSP> 605e8dce4dSJason Molenda Queue::GetThreads () 615e8dce4dSJason Molenda { 625e8dce4dSJason Molenda std::vector<ThreadSP> result; 635e8dce4dSJason Molenda ProcessSP process_sp = m_process_wp.lock(); 645e8dce4dSJason Molenda if (process_sp.get ()) 655e8dce4dSJason Molenda { 665e8dce4dSJason Molenda for (ThreadSP thread_sp : process_sp->Threads()) 675e8dce4dSJason Molenda { 685e8dce4dSJason Molenda if (thread_sp->GetQueueID() == m_queue_id) 695e8dce4dSJason Molenda { 705e8dce4dSJason Molenda result.push_back (thread_sp); 715e8dce4dSJason Molenda } 725e8dce4dSJason Molenda } 735e8dce4dSJason Molenda } 745e8dce4dSJason Molenda return result; 755e8dce4dSJason Molenda } 76*2fd83355SJason Molenda 77*2fd83355SJason Molenda void 78*2fd83355SJason Molenda Queue::SetNumRunningWorkItems (uint32_t count) 79*2fd83355SJason Molenda { 80*2fd83355SJason Molenda m_running_work_items_count = count; 81*2fd83355SJason Molenda } 82*2fd83355SJason Molenda 83*2fd83355SJason Molenda uint32_t 84*2fd83355SJason Molenda Queue::GetNumRunningWorkItems () const 85*2fd83355SJason Molenda { 86*2fd83355SJason Molenda return m_running_work_items_count; 87*2fd83355SJason Molenda } 88*2fd83355SJason Molenda 89*2fd83355SJason Molenda 90*2fd83355SJason Molenda void 91*2fd83355SJason Molenda Queue::SetNumPendingWorkItems (uint32_t count) 92*2fd83355SJason Molenda { 93*2fd83355SJason Molenda m_pending_work_items_count = count; 94*2fd83355SJason Molenda } 95*2fd83355SJason Molenda 96*2fd83355SJason Molenda uint32_t 97*2fd83355SJason Molenda Queue::GetNumPendingWorkItems () const 98*2fd83355SJason Molenda { 99*2fd83355SJason Molenda return m_pending_work_items_count; 100*2fd83355SJason Molenda } 101*2fd83355SJason Molenda 102*2fd83355SJason Molenda void 103*2fd83355SJason Molenda Queue::SetLibdispatchQueueAddress (addr_t dispatch_queue_t_addr) 104*2fd83355SJason Molenda { 105*2fd83355SJason Molenda m_dispatch_queue_t_addr = dispatch_queue_t_addr; 106*2fd83355SJason Molenda } 107*2fd83355SJason Molenda 108*2fd83355SJason Molenda addr_t 109*2fd83355SJason Molenda Queue::GetLibdispatchQueueAddress () const 110*2fd83355SJason Molenda { 111*2fd83355SJason Molenda return m_dispatch_queue_t_addr; 112*2fd83355SJason Molenda } 113*2fd83355SJason Molenda 114*2fd83355SJason Molenda 115*2fd83355SJason Molenda const std::vector<lldb::QueueItemSP> & 116*2fd83355SJason Molenda Queue::GetPendingItems () 117*2fd83355SJason Molenda { 118*2fd83355SJason Molenda if (m_pending_items.size() == 0) 119*2fd83355SJason Molenda { 120*2fd83355SJason Molenda ProcessSP process_sp = m_process_wp.lock(); 121*2fd83355SJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 122*2fd83355SJason Molenda { 123*2fd83355SJason Molenda process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue (this); 124*2fd83355SJason Molenda } 125*2fd83355SJason Molenda } 126*2fd83355SJason Molenda return m_pending_items; 127*2fd83355SJason Molenda } 128