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