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