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