1*0b57cec5SDimitry Andric //===-- SBQueueItem.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/lldb-forward.h"
10*0b57cec5SDimitry Andric 
11*0b57cec5SDimitry Andric #include "lldb/API/SBAddress.h"
12*0b57cec5SDimitry Andric #include "lldb/API/SBQueueItem.h"
13*0b57cec5SDimitry Andric #include "lldb/API/SBThread.h"
14*0b57cec5SDimitry Andric #include "lldb/Core/Address.h"
15*0b57cec5SDimitry Andric #include "lldb/Target/Process.h"
16*0b57cec5SDimitry Andric #include "lldb/Target/QueueItem.h"
17*0b57cec5SDimitry Andric #include "lldb/Target/Thread.h"
18*0b57cec5SDimitry Andric #include "lldb/Utility/Instrumentation.h"
19*0b57cec5SDimitry Andric 
20*0b57cec5SDimitry Andric using namespace lldb;
21*0b57cec5SDimitry Andric using namespace lldb_private;
22*0b57cec5SDimitry Andric 
23*0b57cec5SDimitry Andric // Constructors
SBQueueItem()24*0b57cec5SDimitry Andric SBQueueItem::SBQueueItem() { LLDB_INSTRUMENT_VA(this); }
25*0b57cec5SDimitry Andric 
SBQueueItem(const QueueItemSP & queue_item_sp)26*0b57cec5SDimitry Andric SBQueueItem::SBQueueItem(const QueueItemSP &queue_item_sp)
27*0b57cec5SDimitry Andric     : m_queue_item_sp(queue_item_sp) {
28*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, queue_item_sp);
29*0b57cec5SDimitry Andric }
30*0b57cec5SDimitry Andric 
31*0b57cec5SDimitry Andric // Destructor
~SBQueueItem()32*0b57cec5SDimitry Andric SBQueueItem::~SBQueueItem() { m_queue_item_sp.reset(); }
33*0b57cec5SDimitry Andric 
IsValid() const34*0b57cec5SDimitry Andric bool SBQueueItem::IsValid() const {
35*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
36*0b57cec5SDimitry Andric   return this->operator bool();
37*0b57cec5SDimitry Andric }
operator bool() const38*0b57cec5SDimitry Andric SBQueueItem::operator bool() const {
39*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
40*0b57cec5SDimitry Andric 
41*0b57cec5SDimitry Andric   return m_queue_item_sp.get() != nullptr;
42*0b57cec5SDimitry Andric }
43*0b57cec5SDimitry Andric 
Clear()44*0b57cec5SDimitry Andric void SBQueueItem::Clear() {
45*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
46*0b57cec5SDimitry Andric 
47*0b57cec5SDimitry Andric   m_queue_item_sp.reset();
48*0b57cec5SDimitry Andric }
49*0b57cec5SDimitry Andric 
SetQueueItem(const QueueItemSP & queue_item_sp)50*0b57cec5SDimitry Andric void SBQueueItem::SetQueueItem(const QueueItemSP &queue_item_sp) {
51*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, queue_item_sp);
52*0b57cec5SDimitry Andric 
53*0b57cec5SDimitry Andric   m_queue_item_sp = queue_item_sp;
54*0b57cec5SDimitry Andric }
55*0b57cec5SDimitry Andric 
GetKind() const56*0b57cec5SDimitry Andric lldb::QueueItemKind SBQueueItem::GetKind() const {
57*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
58*0b57cec5SDimitry Andric 
59*0b57cec5SDimitry Andric   QueueItemKind result = eQueueItemKindUnknown;
60*0b57cec5SDimitry Andric   if (m_queue_item_sp) {
61*0b57cec5SDimitry Andric     result = m_queue_item_sp->GetKind();
62*0b57cec5SDimitry Andric   }
63*0b57cec5SDimitry Andric   return result;
64*0b57cec5SDimitry Andric }
65*0b57cec5SDimitry Andric 
SetKind(lldb::QueueItemKind kind)66*0b57cec5SDimitry Andric void SBQueueItem::SetKind(lldb::QueueItemKind kind) {
67*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, kind);
68*0b57cec5SDimitry Andric 
69*0b57cec5SDimitry Andric   if (m_queue_item_sp) {
70*0b57cec5SDimitry Andric     m_queue_item_sp->SetKind(kind);
71*0b57cec5SDimitry Andric   }
72*0b57cec5SDimitry Andric }
73*0b57cec5SDimitry Andric 
GetAddress() const74*0b57cec5SDimitry Andric SBAddress SBQueueItem::GetAddress() const {
75*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
76*0b57cec5SDimitry Andric 
77*0b57cec5SDimitry Andric   SBAddress result;
78*0b57cec5SDimitry Andric   if (m_queue_item_sp) {
79*0b57cec5SDimitry Andric     result.SetAddress(m_queue_item_sp->GetAddress());
80*0b57cec5SDimitry Andric   }
81*0b57cec5SDimitry Andric   return result;
82*0b57cec5SDimitry Andric }
83*0b57cec5SDimitry Andric 
SetAddress(SBAddress addr)84*0b57cec5SDimitry Andric void SBQueueItem::SetAddress(SBAddress addr) {
85*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, addr);
86*0b57cec5SDimitry Andric 
87*0b57cec5SDimitry Andric   if (m_queue_item_sp) {
88*0b57cec5SDimitry Andric     m_queue_item_sp->SetAddress(addr.ref());
89*0b57cec5SDimitry Andric   }
90*0b57cec5SDimitry Andric }
91*0b57cec5SDimitry Andric 
GetExtendedBacktraceThread(const char * type)92*0b57cec5SDimitry Andric SBThread SBQueueItem::GetExtendedBacktraceThread(const char *type) {
93*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, type);
94*0b57cec5SDimitry Andric 
95*0b57cec5SDimitry Andric   SBThread result;
96*0b57cec5SDimitry Andric   if (m_queue_item_sp) {
97*0b57cec5SDimitry Andric     ProcessSP process_sp = m_queue_item_sp->GetProcessSP();
98*0b57cec5SDimitry Andric     Process::StopLocker stop_locker;
99*0b57cec5SDimitry Andric     if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) {
100*0b57cec5SDimitry Andric       ThreadSP thread_sp;
101*0b57cec5SDimitry Andric       ConstString type_const(type);
102*0b57cec5SDimitry Andric       thread_sp = m_queue_item_sp->GetExtendedBacktraceThread(type_const);
103*0b57cec5SDimitry Andric       if (thread_sp) {
104*0b57cec5SDimitry Andric         // Save this in the Process' ExtendedThreadList so a strong pointer
105*0b57cec5SDimitry Andric         // retains the object
106*0b57cec5SDimitry Andric         process_sp->GetExtendedThreadList().AddThread(thread_sp);
107*0b57cec5SDimitry Andric         result.SetThread(thread_sp);
108*0b57cec5SDimitry Andric       }
109*0b57cec5SDimitry Andric     }
110*0b57cec5SDimitry Andric   }
111*0b57cec5SDimitry Andric   return result;
112*0b57cec5SDimitry Andric }
113*0b57cec5SDimitry Andric