xref: /openbsd-src/gnu/llvm/lldb/source/Target/QueueItem.cpp (revision be691f3bb6417f04a68938fadbcaee2d5795e764)
1dda28197Spatrick //===-- QueueItem.cpp -----------------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9061da546Spatrick #include "lldb/Target/Queue.h"
10061da546Spatrick #include "lldb/Target/Process.h"
11061da546Spatrick #include "lldb/Target/QueueItem.h"
12061da546Spatrick #include "lldb/Target/SystemRuntime.h"
13061da546Spatrick 
14061da546Spatrick using namespace lldb;
15061da546Spatrick using namespace lldb_private;
16061da546Spatrick 
QueueItem(QueueSP queue_sp,ProcessSP process_sp,lldb::addr_t item_ref,lldb_private::Address address)17061da546Spatrick QueueItem::QueueItem(QueueSP queue_sp, ProcessSP process_sp,
18061da546Spatrick                      lldb::addr_t item_ref, lldb_private::Address address)
19061da546Spatrick     : m_queue_wp(), m_process_wp(), m_item_ref(item_ref), m_address(address),
20061da546Spatrick       m_have_fetched_entire_item(false), m_kind(eQueueItemKindUnknown),
21061da546Spatrick       m_item_that_enqueued_this_ref(LLDB_INVALID_ADDRESS),
22061da546Spatrick       m_enqueueing_thread_id(LLDB_INVALID_THREAD_ID),
23061da546Spatrick       m_enqueueing_queue_id(LLDB_INVALID_QUEUE_ID),
24061da546Spatrick       m_target_queue_id(LLDB_INVALID_QUEUE_ID), m_stop_id(0), m_backtrace(),
25061da546Spatrick       m_thread_label(), m_queue_label(), m_target_queue_label() {
26061da546Spatrick   m_queue_wp = queue_sp;
27061da546Spatrick   m_process_wp = process_sp;
28061da546Spatrick }
29061da546Spatrick 
30*be691f3bSpatrick QueueItem::~QueueItem() = default;
31061da546Spatrick 
GetKind()32061da546Spatrick QueueItemKind QueueItem::GetKind() {
33061da546Spatrick   FetchEntireItem();
34061da546Spatrick   return m_kind;
35061da546Spatrick }
36061da546Spatrick 
SetKind(QueueItemKind item_kind)37061da546Spatrick void QueueItem::SetKind(QueueItemKind item_kind) { m_kind = item_kind; }
38061da546Spatrick 
GetAddress()39061da546Spatrick Address &QueueItem::GetAddress() { return m_address; }
40061da546Spatrick 
SetAddress(Address addr)41061da546Spatrick void QueueItem::SetAddress(Address addr) { m_address = addr; }
42061da546Spatrick 
GetExtendedBacktraceThread(ConstString type)43061da546Spatrick ThreadSP QueueItem::GetExtendedBacktraceThread(ConstString type) {
44061da546Spatrick   FetchEntireItem();
45061da546Spatrick   ThreadSP return_thread;
46061da546Spatrick   QueueSP queue_sp = m_queue_wp.lock();
47061da546Spatrick   if (queue_sp) {
48061da546Spatrick     ProcessSP process_sp = queue_sp->GetProcess();
49061da546Spatrick     if (process_sp && process_sp->GetSystemRuntime()) {
50061da546Spatrick       return_thread =
51061da546Spatrick           process_sp->GetSystemRuntime()->GetExtendedBacktraceForQueueItem(
52061da546Spatrick               this->shared_from_this(), type);
53061da546Spatrick     }
54061da546Spatrick   }
55061da546Spatrick   return return_thread;
56061da546Spatrick }
57061da546Spatrick 
GetItemThatEnqueuedThis()58061da546Spatrick lldb::addr_t QueueItem::GetItemThatEnqueuedThis() {
59061da546Spatrick   FetchEntireItem();
60061da546Spatrick   return m_item_that_enqueued_this_ref;
61061da546Spatrick }
62061da546Spatrick 
GetEnqueueingThreadID()63061da546Spatrick lldb::tid_t QueueItem::GetEnqueueingThreadID() {
64061da546Spatrick   FetchEntireItem();
65061da546Spatrick   return m_enqueueing_thread_id;
66061da546Spatrick }
67061da546Spatrick 
GetEnqueueingQueueID()68061da546Spatrick lldb::queue_id_t QueueItem::GetEnqueueingQueueID() {
69061da546Spatrick   FetchEntireItem();
70061da546Spatrick   return m_enqueueing_queue_id;
71061da546Spatrick }
72061da546Spatrick 
GetStopID()73061da546Spatrick uint32_t QueueItem::GetStopID() {
74061da546Spatrick   FetchEntireItem();
75061da546Spatrick   return m_stop_id;
76061da546Spatrick }
77061da546Spatrick 
GetEnqueueingBacktrace()78061da546Spatrick std::vector<lldb::addr_t> &QueueItem::GetEnqueueingBacktrace() {
79061da546Spatrick   FetchEntireItem();
80061da546Spatrick   return m_backtrace;
81061da546Spatrick }
82061da546Spatrick 
GetThreadLabel()83061da546Spatrick std::string QueueItem::GetThreadLabel() {
84061da546Spatrick   FetchEntireItem();
85061da546Spatrick   return m_thread_label;
86061da546Spatrick }
87061da546Spatrick 
GetQueueLabel()88061da546Spatrick std::string QueueItem::GetQueueLabel() {
89061da546Spatrick   FetchEntireItem();
90061da546Spatrick   return m_queue_label;
91061da546Spatrick }
92061da546Spatrick 
GetProcessSP()93061da546Spatrick ProcessSP QueueItem::GetProcessSP() { return m_process_wp.lock(); }
94061da546Spatrick 
FetchEntireItem()95061da546Spatrick void QueueItem::FetchEntireItem() {
96061da546Spatrick   if (m_have_fetched_entire_item)
97061da546Spatrick     return;
98061da546Spatrick   ProcessSP process_sp = m_process_wp.lock();
99061da546Spatrick   if (process_sp) {
100061da546Spatrick     SystemRuntime *runtime = process_sp->GetSystemRuntime();
101061da546Spatrick     if (runtime) {
102061da546Spatrick       runtime->CompleteQueueItem(this, m_item_ref);
103061da546Spatrick       m_have_fetched_entire_item = true;
104061da546Spatrick     }
105061da546Spatrick   }
106061da546Spatrick }
107