1*0b57cec5SDimitry Andric //===-- Queue.cpp ---------------------------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #include "lldb/Target/Queue.h"
10*0b57cec5SDimitry Andric #include "lldb/Target/Process.h"
11*0b57cec5SDimitry Andric #include "lldb/Target/QueueList.h"
12*0b57cec5SDimitry Andric #include "lldb/Target/SystemRuntime.h"
13*0b57cec5SDimitry Andric #include "lldb/Target/Thread.h"
14*0b57cec5SDimitry Andric 
15*0b57cec5SDimitry Andric using namespace lldb;
16*0b57cec5SDimitry Andric using namespace lldb_private;
17*0b57cec5SDimitry Andric 
Queue(ProcessSP process_sp,lldb::queue_id_t queue_id,const char * queue_name)18*0b57cec5SDimitry Andric Queue::Queue(ProcessSP process_sp, lldb::queue_id_t queue_id,
19*0b57cec5SDimitry Andric              const char *queue_name)
20*0b57cec5SDimitry Andric     : m_process_wp(), m_queue_id(queue_id), m_queue_name(),
21*0b57cec5SDimitry Andric       m_running_work_items_count(0), m_pending_work_items_count(0),
22*0b57cec5SDimitry Andric       m_pending_items(), m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS),
23*0b57cec5SDimitry Andric       m_kind(eQueueKindUnknown) {
24*0b57cec5SDimitry Andric   if (queue_name)
25*0b57cec5SDimitry Andric     m_queue_name = queue_name;
26*0b57cec5SDimitry Andric 
27*0b57cec5SDimitry Andric   m_process_wp = process_sp;
28*0b57cec5SDimitry Andric }
29*0b57cec5SDimitry Andric 
30*0b57cec5SDimitry Andric Queue::~Queue() = default;
31*0b57cec5SDimitry Andric 
GetID()32*0b57cec5SDimitry Andric queue_id_t Queue::GetID() { return m_queue_id; }
33*0b57cec5SDimitry Andric 
GetName()34*0b57cec5SDimitry Andric const char *Queue::GetName() {
35*0b57cec5SDimitry Andric   return (m_queue_name.empty() ? nullptr : m_queue_name.c_str());
36*0b57cec5SDimitry Andric }
37*0b57cec5SDimitry Andric 
GetIndexID()38*0b57cec5SDimitry Andric uint32_t Queue::GetIndexID() { return m_queue_id; }
39*0b57cec5SDimitry Andric 
GetThreads()40*0b57cec5SDimitry Andric std::vector<lldb::ThreadSP> Queue::GetThreads() {
41*0b57cec5SDimitry Andric   std::vector<ThreadSP> result;
42*0b57cec5SDimitry Andric   ProcessSP process_sp = m_process_wp.lock();
43*0b57cec5SDimitry Andric   if (process_sp) {
44*0b57cec5SDimitry Andric     for (ThreadSP thread_sp : process_sp->Threads()) {
45*0b57cec5SDimitry Andric       if (thread_sp->GetQueueID() == m_queue_id) {
46*0b57cec5SDimitry Andric         result.push_back(thread_sp);
47*0b57cec5SDimitry Andric       }
48*0b57cec5SDimitry Andric     }
49*0b57cec5SDimitry Andric   }
50*0b57cec5SDimitry Andric   return result;
51*0b57cec5SDimitry Andric }
52*0b57cec5SDimitry Andric 
SetNumRunningWorkItems(uint32_t count)53*0b57cec5SDimitry Andric void Queue::SetNumRunningWorkItems(uint32_t count) {
54*0b57cec5SDimitry Andric   m_running_work_items_count = count;
55*0b57cec5SDimitry Andric }
56*0b57cec5SDimitry Andric 
GetNumRunningWorkItems() const57*0b57cec5SDimitry Andric uint32_t Queue::GetNumRunningWorkItems() const {
58*0b57cec5SDimitry Andric   return m_running_work_items_count;
59*0b57cec5SDimitry Andric }
60*0b57cec5SDimitry Andric 
SetNumPendingWorkItems(uint32_t count)61*0b57cec5SDimitry Andric void Queue::SetNumPendingWorkItems(uint32_t count) {
62*0b57cec5SDimitry Andric   m_pending_work_items_count = count;
63*0b57cec5SDimitry Andric }
64*0b57cec5SDimitry Andric 
GetNumPendingWorkItems() const65*0b57cec5SDimitry Andric uint32_t Queue::GetNumPendingWorkItems() const {
66*0b57cec5SDimitry Andric   return m_pending_work_items_count;
67*0b57cec5SDimitry Andric }
68*0b57cec5SDimitry Andric 
SetLibdispatchQueueAddress(addr_t dispatch_queue_t_addr)69*0b57cec5SDimitry Andric void Queue::SetLibdispatchQueueAddress(addr_t dispatch_queue_t_addr) {
70*0b57cec5SDimitry Andric   m_dispatch_queue_t_addr = dispatch_queue_t_addr;
71*0b57cec5SDimitry Andric }
72*0b57cec5SDimitry Andric 
GetLibdispatchQueueAddress() const73*0b57cec5SDimitry Andric addr_t Queue::GetLibdispatchQueueAddress() const {
74*0b57cec5SDimitry Andric   return m_dispatch_queue_t_addr;
75*0b57cec5SDimitry Andric }
76*0b57cec5SDimitry Andric 
GetPendingItems()77*0b57cec5SDimitry Andric const std::vector<lldb::QueueItemSP> &Queue::GetPendingItems() {
78*0b57cec5SDimitry Andric   if (m_pending_items.empty()) {
79*0b57cec5SDimitry Andric     ProcessSP process_sp = m_process_wp.lock();
80*0b57cec5SDimitry Andric     if (process_sp && process_sp->GetSystemRuntime()) {
81*0b57cec5SDimitry Andric       process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue(this);
82*0b57cec5SDimitry Andric     }
83*0b57cec5SDimitry Andric   }
84*0b57cec5SDimitry Andric   return m_pending_items;
85*0b57cec5SDimitry Andric }
86*0b57cec5SDimitry Andric 
GetKind()87*0b57cec5SDimitry Andric lldb::QueueKind Queue::GetKind() { return m_kind; }
88*0b57cec5SDimitry Andric 
SetKind(lldb::QueueKind kind)89*0b57cec5SDimitry Andric void Queue::SetKind(lldb::QueueKind kind) { m_kind = kind; }
90