| //===-- Queue.cpp ---------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "lldb/Target/Queue.h" | |
| #include "lldb/Target/Process.h" | |
| #include "lldb/Target/QueueList.h" | |
| #include "lldb/Target/SystemRuntime.h" | |
| #include "lldb/Target/Thread.h" | |
| using namespace lldb; | |
| using namespace lldb_private; | |
| Queue::Queue(ProcessSP process_sp, lldb::queue_id_t queue_id, | |
| const char *queue_name) | |
| : m_process_wp(), m_queue_id(queue_id), m_queue_name(), | |
| m_running_work_items_count(0), m_pending_work_items_count(0), | |
| m_pending_items(), m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS), | |
| m_kind(eQueueKindUnknown) { | |
| if (queue_name) | |
| m_queue_name = queue_name; | |
| m_process_wp = process_sp; | |
| } | |
| Queue::~Queue() = default; | |
| queue_id_t Queue::GetID() { return m_queue_id; } | |
| const char *Queue::GetName() { | |
| return (m_queue_name.empty() ? nullptr : m_queue_name.c_str()); | |
| } | |
| uint32_t Queue::GetIndexID() { return m_queue_id; } | |
| std::vector<lldb::ThreadSP> Queue::GetThreads() { | |
| std::vector<ThreadSP> result; | |
| ProcessSP process_sp = m_process_wp.lock(); | |
| if (process_sp) { | |
| for (ThreadSP thread_sp : process_sp->Threads()) { | |
| if (thread_sp->GetQueueID() == m_queue_id) { | |
| result.push_back(thread_sp); | |
| } | |
| } | |
| } | |
| return result; | |
| } | |
| void Queue::SetNumRunningWorkItems(uint32_t count) { | |
| m_running_work_items_count = count; | |
| } | |
| uint32_t Queue::GetNumRunningWorkItems() const { | |
| return m_running_work_items_count; | |
| } | |
| void Queue::SetNumPendingWorkItems(uint32_t count) { | |
| m_pending_work_items_count = count; | |
| } | |
| uint32_t Queue::GetNumPendingWorkItems() const { | |
| return m_pending_work_items_count; | |
| } | |
| void Queue::SetLibdispatchQueueAddress(addr_t dispatch_queue_t_addr) { | |
| m_dispatch_queue_t_addr = dispatch_queue_t_addr; | |
| } | |
| addr_t Queue::GetLibdispatchQueueAddress() const { | |
| return m_dispatch_queue_t_addr; | |
| } | |
| const std::vector<lldb::QueueItemSP> &Queue::GetPendingItems() { | |
| if (m_pending_items.empty()) { | |
| ProcessSP process_sp = m_process_wp.lock(); | |
| if (process_sp && process_sp->GetSystemRuntime()) { | |
| process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue(this); | |
| } | |
| } | |
| return m_pending_items; | |
| } | |
| lldb::QueueKind Queue::GetKind() { return m_kind; } | |
| void Queue::SetKind(lldb::QueueKind kind) { m_kind = kind; } |