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 AndricSBQueueItem::SBQueueItem() { LLDB_INSTRUMENT_VA(this); } 25*0b57cec5SDimitry Andric SBQueueItem(const QueueItemSP & queue_item_sp)26*0b57cec5SDimitry AndricSBQueueItem::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 AndricSBQueueItem::~SBQueueItem() { m_queue_item_sp.reset(); } 33*0b57cec5SDimitry Andric IsValid() const34*0b57cec5SDimitry Andricbool SBQueueItem::IsValid() const { 35*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this); 36*0b57cec5SDimitry Andric return this->operator bool(); 37*0b57cec5SDimitry Andric } operator bool() const38*0b57cec5SDimitry AndricSBQueueItem::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 Andricvoid 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 Andricvoid 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 Andriclldb::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 Andricvoid 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 AndricSBAddress 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 Andricvoid 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 AndricSBThread 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