1*0b57cec5SDimitry Andric //===-- QueueItem.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/QueueItem.h"
12*0b57cec5SDimitry Andric #include "lldb/Target/SystemRuntime.h"
13*0b57cec5SDimitry Andric
14*0b57cec5SDimitry Andric using namespace lldb;
15*0b57cec5SDimitry Andric using namespace lldb_private;
16*0b57cec5SDimitry Andric
QueueItem(QueueSP queue_sp,ProcessSP process_sp,lldb::addr_t item_ref,lldb_private::Address address)17*0b57cec5SDimitry Andric QueueItem::QueueItem(QueueSP queue_sp, ProcessSP process_sp,
18*0b57cec5SDimitry Andric lldb::addr_t item_ref, lldb_private::Address address)
19*0b57cec5SDimitry Andric : m_queue_wp(), m_process_wp(), m_item_ref(item_ref), m_address(address),
20*0b57cec5SDimitry Andric m_have_fetched_entire_item(false), m_kind(eQueueItemKindUnknown),
21*0b57cec5SDimitry Andric m_item_that_enqueued_this_ref(LLDB_INVALID_ADDRESS),
22*0b57cec5SDimitry Andric m_enqueueing_thread_id(LLDB_INVALID_THREAD_ID),
23*0b57cec5SDimitry Andric m_enqueueing_queue_id(LLDB_INVALID_QUEUE_ID),
24*0b57cec5SDimitry Andric m_target_queue_id(LLDB_INVALID_QUEUE_ID), m_stop_id(0), m_backtrace(),
25*0b57cec5SDimitry Andric m_thread_label(), m_queue_label(), m_target_queue_label() {
26*0b57cec5SDimitry Andric m_queue_wp = queue_sp;
27*0b57cec5SDimitry Andric m_process_wp = process_sp;
28*0b57cec5SDimitry Andric }
29*0b57cec5SDimitry Andric
30*0b57cec5SDimitry Andric QueueItem::~QueueItem() = default;
31*0b57cec5SDimitry Andric
GetKind()32*0b57cec5SDimitry Andric QueueItemKind QueueItem::GetKind() {
33*0b57cec5SDimitry Andric FetchEntireItem();
34*0b57cec5SDimitry Andric return m_kind;
35*0b57cec5SDimitry Andric }
36*0b57cec5SDimitry Andric
SetKind(QueueItemKind item_kind)37*0b57cec5SDimitry Andric void QueueItem::SetKind(QueueItemKind item_kind) { m_kind = item_kind; }
38*0b57cec5SDimitry Andric
GetAddress()39*0b57cec5SDimitry Andric Address &QueueItem::GetAddress() { return m_address; }
40*0b57cec5SDimitry Andric
SetAddress(Address addr)41*0b57cec5SDimitry Andric void QueueItem::SetAddress(Address addr) { m_address = addr; }
42*0b57cec5SDimitry Andric
GetExtendedBacktraceThread(ConstString type)43*0b57cec5SDimitry Andric ThreadSP QueueItem::GetExtendedBacktraceThread(ConstString type) {
44*0b57cec5SDimitry Andric FetchEntireItem();
45*0b57cec5SDimitry Andric ThreadSP return_thread;
46*0b57cec5SDimitry Andric QueueSP queue_sp = m_queue_wp.lock();
47*0b57cec5SDimitry Andric if (queue_sp) {
48*0b57cec5SDimitry Andric ProcessSP process_sp = queue_sp->GetProcess();
49*0b57cec5SDimitry Andric if (process_sp && process_sp->GetSystemRuntime()) {
50*0b57cec5SDimitry Andric return_thread =
51*0b57cec5SDimitry Andric process_sp->GetSystemRuntime()->GetExtendedBacktraceForQueueItem(
52*0b57cec5SDimitry Andric this->shared_from_this(), type);
53*0b57cec5SDimitry Andric }
54*0b57cec5SDimitry Andric }
55*0b57cec5SDimitry Andric return return_thread;
56*0b57cec5SDimitry Andric }
57*0b57cec5SDimitry Andric
GetItemThatEnqueuedThis()58*0b57cec5SDimitry Andric lldb::addr_t QueueItem::GetItemThatEnqueuedThis() {
59*0b57cec5SDimitry Andric FetchEntireItem();
60*0b57cec5SDimitry Andric return m_item_that_enqueued_this_ref;
61*0b57cec5SDimitry Andric }
62*0b57cec5SDimitry Andric
GetEnqueueingThreadID()63*0b57cec5SDimitry Andric lldb::tid_t QueueItem::GetEnqueueingThreadID() {
64*0b57cec5SDimitry Andric FetchEntireItem();
65*0b57cec5SDimitry Andric return m_enqueueing_thread_id;
66*0b57cec5SDimitry Andric }
67*0b57cec5SDimitry Andric
GetEnqueueingQueueID()68*0b57cec5SDimitry Andric lldb::queue_id_t QueueItem::GetEnqueueingQueueID() {
69*0b57cec5SDimitry Andric FetchEntireItem();
70*0b57cec5SDimitry Andric return m_enqueueing_queue_id;
71*0b57cec5SDimitry Andric }
72*0b57cec5SDimitry Andric
GetStopID()73*0b57cec5SDimitry Andric uint32_t QueueItem::GetStopID() {
74*0b57cec5SDimitry Andric FetchEntireItem();
75*0b57cec5SDimitry Andric return m_stop_id;
76*0b57cec5SDimitry Andric }
77*0b57cec5SDimitry Andric
GetEnqueueingBacktrace()78*0b57cec5SDimitry Andric std::vector<lldb::addr_t> &QueueItem::GetEnqueueingBacktrace() {
79*0b57cec5SDimitry Andric FetchEntireItem();
80*0b57cec5SDimitry Andric return m_backtrace;
81*0b57cec5SDimitry Andric }
82*0b57cec5SDimitry Andric
GetThreadLabel()83*0b57cec5SDimitry Andric std::string QueueItem::GetThreadLabel() {
84*0b57cec5SDimitry Andric FetchEntireItem();
85*0b57cec5SDimitry Andric return m_thread_label;
86*0b57cec5SDimitry Andric }
87*0b57cec5SDimitry Andric
GetQueueLabel()88*0b57cec5SDimitry Andric std::string QueueItem::GetQueueLabel() {
89*0b57cec5SDimitry Andric FetchEntireItem();
90*0b57cec5SDimitry Andric return m_queue_label;
91*0b57cec5SDimitry Andric }
92*0b57cec5SDimitry Andric
GetProcessSP()93*0b57cec5SDimitry Andric ProcessSP QueueItem::GetProcessSP() { return m_process_wp.lock(); }
94*0b57cec5SDimitry Andric
FetchEntireItem()95*0b57cec5SDimitry Andric void QueueItem::FetchEntireItem() {
96*0b57cec5SDimitry Andric if (m_have_fetched_entire_item)
97*0b57cec5SDimitry Andric return;
98*0b57cec5SDimitry Andric ProcessSP process_sp = m_process_wp.lock();
99*0b57cec5SDimitry Andric if (process_sp) {
100*0b57cec5SDimitry Andric SystemRuntime *runtime = process_sp->GetSystemRuntime();
101*0b57cec5SDimitry Andric if (runtime) {
102*0b57cec5SDimitry Andric runtime->CompleteQueueItem(this, m_item_ref);
103*0b57cec5SDimitry Andric m_have_fetched_entire_item = true;
104*0b57cec5SDimitry Andric }
105*0b57cec5SDimitry Andric }
106*0b57cec5SDimitry Andric }
107