| //===-- Queue.cpp -----------------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // C Includes |
| // C++ Includes |
| // Other libraries and framework includes |
| // Project includes |
| #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; } |