1262182Semaste//===-- SBQueueItem.cpp -----------------------------------------*- C++ -*-===// 2262182Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6262182Semaste// 7262182Semaste//===----------------------------------------------------------------------===// 8262182Semaste 9262182Semaste#include "lldb/lldb-forward.h" 10262182Semaste 11353358Sdim#include "SBReproducerPrivate.h" 12262182Semaste#include "lldb/API/SBAddress.h" 13262182Semaste#include "lldb/API/SBQueueItem.h" 14262182Semaste#include "lldb/API/SBThread.h" 15262182Semaste#include "lldb/Core/Address.h" 16276479Sdim#include "lldb/Target/Process.h" 17262182Semaste#include "lldb/Target/QueueItem.h" 18262182Semaste#include "lldb/Target/Thread.h" 19262182Semaste 20262182Semasteusing namespace lldb; 21262182Semasteusing namespace lldb_private; 22262182Semaste 23262182Semaste// Constructors 24353358SdimSBQueueItem::SBQueueItem() : m_queue_item_sp() { 25353358Sdim LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBQueueItem); 26353358Sdim} 27262182Semaste 28314564SdimSBQueueItem::SBQueueItem(const QueueItemSP &queue_item_sp) 29353358Sdim : m_queue_item_sp(queue_item_sp) { 30353358Sdim LLDB_RECORD_CONSTRUCTOR(SBQueueItem, (const lldb::QueueItemSP &), 31353358Sdim queue_item_sp); 32353358Sdim} 33262182Semaste 34262182Semaste// Destructor 35314564SdimSBQueueItem::~SBQueueItem() { m_queue_item_sp.reset(); } 36262182Semaste 37314564Sdimbool SBQueueItem::IsValid() const { 38353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBQueueItem, IsValid); 39353358Sdim return this->operator bool(); 40262182Semaste} 41353358SdimSBQueueItem::operator bool() const { 42353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBQueueItem, operator bool); 43262182Semaste 44353358Sdim return m_queue_item_sp.get() != nullptr; 45353358Sdim} 46353358Sdim 47314564Sdimvoid SBQueueItem::Clear() { 48353358Sdim LLDB_RECORD_METHOD_NO_ARGS(void, SBQueueItem, Clear); 49353358Sdim 50314564Sdim m_queue_item_sp.reset(); 51262182Semaste} 52262182Semaste 53314564Sdimvoid SBQueueItem::SetQueueItem(const QueueItemSP &queue_item_sp) { 54353358Sdim LLDB_RECORD_METHOD(void, SBQueueItem, SetQueueItem, 55353358Sdim (const lldb::QueueItemSP &), queue_item_sp); 56353358Sdim 57314564Sdim m_queue_item_sp = queue_item_sp; 58262182Semaste} 59262182Semaste 60314564Sdimlldb::QueueItemKind SBQueueItem::GetKind() const { 61353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::QueueItemKind, SBQueueItem, GetKind); 62353358Sdim 63314564Sdim QueueItemKind result = eQueueItemKindUnknown; 64314564Sdim if (m_queue_item_sp) { 65314564Sdim result = m_queue_item_sp->GetKind(); 66314564Sdim } 67314564Sdim return result; 68262182Semaste} 69262182Semaste 70314564Sdimvoid SBQueueItem::SetKind(lldb::QueueItemKind kind) { 71353358Sdim LLDB_RECORD_METHOD(void, SBQueueItem, SetKind, (lldb::QueueItemKind), kind); 72353358Sdim 73314564Sdim if (m_queue_item_sp) { 74314564Sdim m_queue_item_sp->SetKind(kind); 75314564Sdim } 76262182Semaste} 77262182Semaste 78314564SdimSBAddress SBQueueItem::GetAddress() const { 79353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBQueueItem, GetAddress); 80353358Sdim 81314564Sdim SBAddress result; 82314564Sdim if (m_queue_item_sp) { 83314564Sdim result.SetAddress(&m_queue_item_sp->GetAddress()); 84314564Sdim } 85353358Sdim return LLDB_RECORD_RESULT(result); 86262182Semaste} 87262182Semaste 88314564Sdimvoid SBQueueItem::SetAddress(SBAddress addr) { 89353358Sdim LLDB_RECORD_METHOD(void, SBQueueItem, SetAddress, (lldb::SBAddress), addr); 90353358Sdim 91314564Sdim if (m_queue_item_sp) { 92314564Sdim m_queue_item_sp->SetAddress(addr.ref()); 93314564Sdim } 94262182Semaste} 95262182Semaste 96314564SdimSBThread SBQueueItem::GetExtendedBacktraceThread(const char *type) { 97353358Sdim LLDB_RECORD_METHOD(lldb::SBThread, SBQueueItem, GetExtendedBacktraceThread, 98353358Sdim (const char *), type); 99353358Sdim 100314564Sdim SBThread result; 101314564Sdim if (m_queue_item_sp) { 102314564Sdim ProcessSP process_sp = m_queue_item_sp->GetProcessSP(); 103314564Sdim Process::StopLocker stop_locker; 104314564Sdim if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) { 105314564Sdim ThreadSP thread_sp; 106314564Sdim ConstString type_const(type); 107314564Sdim thread_sp = m_queue_item_sp->GetExtendedBacktraceThread(type_const); 108314564Sdim if (thread_sp) { 109314564Sdim // Save this in the Process' ExtendedThreadList so a strong pointer 110341825Sdim // retains the object 111314564Sdim process_sp->GetExtendedThreadList().AddThread(thread_sp); 112314564Sdim result.SetThread(thread_sp); 113314564Sdim } 114262182Semaste } 115314564Sdim } 116353358Sdim return LLDB_RECORD_RESULT(result); 117262182Semaste} 118353358Sdim 119353358Sdimnamespace lldb_private { 120353358Sdimnamespace repro { 121353358Sdim 122353358Sdimtemplate <> 123353358Sdimvoid RegisterMethods<SBQueueItem>(Registry &R) { 124353358Sdim LLDB_REGISTER_CONSTRUCTOR(SBQueueItem, ()); 125353358Sdim LLDB_REGISTER_CONSTRUCTOR(SBQueueItem, (const lldb::QueueItemSP &)); 126353358Sdim LLDB_REGISTER_METHOD_CONST(bool, SBQueueItem, IsValid, ()); 127353358Sdim LLDB_REGISTER_METHOD_CONST(bool, SBQueueItem, operator bool, ()); 128353358Sdim LLDB_REGISTER_METHOD(void, SBQueueItem, Clear, ()); 129353358Sdim LLDB_REGISTER_METHOD(void, SBQueueItem, SetQueueItem, 130353358Sdim (const lldb::QueueItemSP &)); 131353358Sdim LLDB_REGISTER_METHOD_CONST(lldb::QueueItemKind, SBQueueItem, GetKind, ()); 132353358Sdim LLDB_REGISTER_METHOD(void, SBQueueItem, SetKind, (lldb::QueueItemKind)); 133353358Sdim LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBQueueItem, GetAddress, ()); 134353358Sdim LLDB_REGISTER_METHOD(void, SBQueueItem, SetAddress, (lldb::SBAddress)); 135353358Sdim LLDB_REGISTER_METHOD(lldb::SBThread, SBQueueItem, 136353358Sdim GetExtendedBacktraceThread, (const char *)); 137353358Sdim} 138353358Sdim 139353358Sdim} 140353358Sdim} 141