1262182Semaste//===-- Queue.cpp -----------------------------------------------*- C++ -*-===// 2262182Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6262182Semaste// 7262182Semaste//===----------------------------------------------------------------------===// 8262182Semaste 9314564Sdim#include "lldb/Target/Queue.h" 10262182Semaste#include "lldb/Target/Process.h" 11262182Semaste#include "lldb/Target/QueueList.h" 12314564Sdim#include "lldb/Target/SystemRuntime.h" 13262182Semaste#include "lldb/Target/Thread.h" 14262182Semaste 15262182Semasteusing namespace lldb; 16262182Semasteusing namespace lldb_private; 17262182Semaste 18314564SdimQueue::Queue(ProcessSP process_sp, lldb::queue_id_t queue_id, 19314564Sdim const char *queue_name) 20314564Sdim : m_process_wp(), m_queue_id(queue_id), m_queue_name(), 21314564Sdim m_running_work_items_count(0), m_pending_work_items_count(0), 22314564Sdim m_pending_items(), m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS), 23314564Sdim m_kind(eQueueKindUnknown) { 24314564Sdim if (queue_name) 25314564Sdim m_queue_name = queue_name; 26262182Semaste 27314564Sdim m_process_wp = process_sp; 28262182Semaste} 29262182Semaste 30309124SdimQueue::~Queue() = default; 31262182Semaste 32314564Sdimqueue_id_t Queue::GetID() { return m_queue_id; } 33262182Semaste 34314564Sdimconst char *Queue::GetName() { 35314564Sdim return (m_queue_name.empty() ? nullptr : m_queue_name.c_str()); 36262182Semaste} 37262182Semaste 38314564Sdimuint32_t Queue::GetIndexID() { return m_queue_id; } 39262182Semaste 40314564Sdimstd::vector<lldb::ThreadSP> Queue::GetThreads() { 41314564Sdim std::vector<ThreadSP> result; 42314564Sdim ProcessSP process_sp = m_process_wp.lock(); 43314564Sdim if (process_sp) { 44314564Sdim for (ThreadSP thread_sp : process_sp->Threads()) { 45314564Sdim if (thread_sp->GetQueueID() == m_queue_id) { 46314564Sdim result.push_back(thread_sp); 47314564Sdim } 48262182Semaste } 49314564Sdim } 50314564Sdim return result; 51262182Semaste} 52262182Semaste 53314564Sdimvoid Queue::SetNumRunningWorkItems(uint32_t count) { 54314564Sdim m_running_work_items_count = count; 55262182Semaste} 56262182Semaste 57314564Sdimuint32_t Queue::GetNumRunningWorkItems() const { 58314564Sdim return m_running_work_items_count; 59262182Semaste} 60262182Semaste 61314564Sdimvoid Queue::SetNumPendingWorkItems(uint32_t count) { 62314564Sdim m_pending_work_items_count = count; 63262182Semaste} 64262182Semaste 65314564Sdimuint32_t Queue::GetNumPendingWorkItems() const { 66314564Sdim return m_pending_work_items_count; 67262182Semaste} 68262182Semaste 69314564Sdimvoid Queue::SetLibdispatchQueueAddress(addr_t dispatch_queue_t_addr) { 70314564Sdim m_dispatch_queue_t_addr = dispatch_queue_t_addr; 71262182Semaste} 72262182Semaste 73314564Sdimaddr_t Queue::GetLibdispatchQueueAddress() const { 74314564Sdim return m_dispatch_queue_t_addr; 75262182Semaste} 76262182Semaste 77314564Sdimconst std::vector<lldb::QueueItemSP> &Queue::GetPendingItems() { 78314564Sdim if (m_pending_items.empty()) { 79314564Sdim ProcessSP process_sp = m_process_wp.lock(); 80314564Sdim if (process_sp && process_sp->GetSystemRuntime()) { 81314564Sdim process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue(this); 82262182Semaste } 83314564Sdim } 84314564Sdim return m_pending_items; 85262182Semaste} 86276479Sdim 87314564Sdimlldb::QueueKind Queue::GetKind() { return m_kind; } 88276479Sdim 89314564Sdimvoid Queue::SetKind(lldb::QueueKind kind) { m_kind = kind; } 90