1 //===-- Queue.cpp -----------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Target/Process.h" 11 #include "lldb/Target/Queue.h" 12 #include "lldb/Target/QueueList.h" 13 #include "lldb/Target/Thread.h" 14 #include "lldb/Target/SystemRuntime.h" 15 16 using namespace lldb; 17 using namespace lldb_private; 18 19 Queue::Queue (ProcessSP process_sp, lldb::queue_id_t queue_id, const char *queue_name) : 20 m_process_wp (), 21 m_queue_id (queue_id), 22 m_queue_name (), 23 m_running_work_items_count(0), 24 m_pending_work_items_count(0), 25 m_pending_items(), 26 m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS) 27 { 28 if (queue_name) 29 m_queue_name = queue_name; 30 31 m_process_wp = process_sp; 32 } 33 34 Queue::~Queue () 35 { 36 } 37 38 queue_id_t 39 Queue::GetID () 40 { 41 return m_queue_id; 42 } 43 44 const char * 45 Queue::GetName () 46 { 47 const char *result = NULL; 48 if (m_queue_name.size() > 0) 49 result = m_queue_name.c_str(); 50 return result; 51 } 52 53 uint32_t 54 Queue::GetIndexID () 55 { 56 return m_queue_id; 57 } 58 59 std::vector<lldb::ThreadSP> 60 Queue::GetThreads () 61 { 62 std::vector<ThreadSP> result; 63 ProcessSP process_sp = m_process_wp.lock(); 64 if (process_sp.get ()) 65 { 66 for (ThreadSP thread_sp : process_sp->Threads()) 67 { 68 if (thread_sp->GetQueueID() == m_queue_id) 69 { 70 result.push_back (thread_sp); 71 } 72 } 73 } 74 return result; 75 } 76 77 void 78 Queue::SetNumRunningWorkItems (uint32_t count) 79 { 80 m_running_work_items_count = count; 81 } 82 83 uint32_t 84 Queue::GetNumRunningWorkItems () const 85 { 86 return m_running_work_items_count; 87 } 88 89 90 void 91 Queue::SetNumPendingWorkItems (uint32_t count) 92 { 93 m_pending_work_items_count = count; 94 } 95 96 uint32_t 97 Queue::GetNumPendingWorkItems () const 98 { 99 return m_pending_work_items_count; 100 } 101 102 void 103 Queue::SetLibdispatchQueueAddress (addr_t dispatch_queue_t_addr) 104 { 105 m_dispatch_queue_t_addr = dispatch_queue_t_addr; 106 } 107 108 addr_t 109 Queue::GetLibdispatchQueueAddress () const 110 { 111 return m_dispatch_queue_t_addr; 112 } 113 114 115 const std::vector<lldb::QueueItemSP> & 116 Queue::GetPendingItems () 117 { 118 if (m_pending_items.size() == 0) 119 { 120 ProcessSP process_sp = m_process_wp.lock(); 121 if (process_sp && process_sp->GetSystemRuntime()) 122 { 123 process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue (this); 124 } 125 } 126 return m_pending_items; 127 } 128