1//===-- SBQueueItem.cpp -----------------------------------------*- C++ -*-===// 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 "SBReproducerPrivate.h" 12#include "lldb/API/SBAddress.h" 13#include "lldb/API/SBQueueItem.h" 14#include "lldb/API/SBThread.h" 15#include "lldb/Core/Address.h" 16#include "lldb/Target/Process.h" 17#include "lldb/Target/QueueItem.h" 18#include "lldb/Target/Thread.h" 19 20using namespace lldb; 21using namespace lldb_private; 22 23// Constructors 24SBQueueItem::SBQueueItem() : m_queue_item_sp() { 25 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBQueueItem); 26} 27 28SBQueueItem::SBQueueItem(const QueueItemSP &queue_item_sp) 29 : m_queue_item_sp(queue_item_sp) { 30 LLDB_RECORD_CONSTRUCTOR(SBQueueItem, (const lldb::QueueItemSP &), 31 queue_item_sp); 32} 33 34// Destructor 35SBQueueItem::~SBQueueItem() { m_queue_item_sp.reset(); } 36 37bool SBQueueItem::IsValid() const { 38 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBQueueItem, IsValid); 39 return this->operator bool(); 40} 41SBQueueItem::operator bool() const { 42 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBQueueItem, operator bool); 43 44 return m_queue_item_sp.get() != nullptr; 45} 46 47void SBQueueItem::Clear() { 48 LLDB_RECORD_METHOD_NO_ARGS(void, SBQueueItem, Clear); 49 50 m_queue_item_sp.reset(); 51} 52 53void SBQueueItem::SetQueueItem(const QueueItemSP &queue_item_sp) { 54 LLDB_RECORD_METHOD(void, SBQueueItem, SetQueueItem, 55 (const lldb::QueueItemSP &), queue_item_sp); 56 57 m_queue_item_sp = queue_item_sp; 58} 59 60lldb::QueueItemKind SBQueueItem::GetKind() const { 61 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::QueueItemKind, SBQueueItem, GetKind); 62 63 QueueItemKind result = eQueueItemKindUnknown; 64 if (m_queue_item_sp) { 65 result = m_queue_item_sp->GetKind(); 66 } 67 return result; 68} 69 70void SBQueueItem::SetKind(lldb::QueueItemKind kind) { 71 LLDB_RECORD_METHOD(void, SBQueueItem, SetKind, (lldb::QueueItemKind), kind); 72 73 if (m_queue_item_sp) { 74 m_queue_item_sp->SetKind(kind); 75 } 76} 77 78SBAddress SBQueueItem::GetAddress() const { 79 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBQueueItem, GetAddress); 80 81 SBAddress result; 82 if (m_queue_item_sp) { 83 result.SetAddress(&m_queue_item_sp->GetAddress()); 84 } 85 return LLDB_RECORD_RESULT(result); 86} 87 88void SBQueueItem::SetAddress(SBAddress addr) { 89 LLDB_RECORD_METHOD(void, SBQueueItem, SetAddress, (lldb::SBAddress), addr); 90 91 if (m_queue_item_sp) { 92 m_queue_item_sp->SetAddress(addr.ref()); 93 } 94} 95 96SBThread SBQueueItem::GetExtendedBacktraceThread(const char *type) { 97 LLDB_RECORD_METHOD(lldb::SBThread, SBQueueItem, GetExtendedBacktraceThread, 98 (const char *), type); 99 100 SBThread result; 101 if (m_queue_item_sp) { 102 ProcessSP process_sp = m_queue_item_sp->GetProcessSP(); 103 Process::StopLocker stop_locker; 104 if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) { 105 ThreadSP thread_sp; 106 ConstString type_const(type); 107 thread_sp = m_queue_item_sp->GetExtendedBacktraceThread(type_const); 108 if (thread_sp) { 109 // Save this in the Process' ExtendedThreadList so a strong pointer 110 // retains the object 111 process_sp->GetExtendedThreadList().AddThread(thread_sp); 112 result.SetThread(thread_sp); 113 } 114 } 115 } 116 return LLDB_RECORD_RESULT(result); 117} 118 119namespace lldb_private { 120namespace repro { 121 122template <> 123void RegisterMethods<SBQueueItem>(Registry &R) { 124 LLDB_REGISTER_CONSTRUCTOR(SBQueueItem, ()); 125 LLDB_REGISTER_CONSTRUCTOR(SBQueueItem, (const lldb::QueueItemSP &)); 126 LLDB_REGISTER_METHOD_CONST(bool, SBQueueItem, IsValid, ()); 127 LLDB_REGISTER_METHOD_CONST(bool, SBQueueItem, operator bool, ()); 128 LLDB_REGISTER_METHOD(void, SBQueueItem, Clear, ()); 129 LLDB_REGISTER_METHOD(void, SBQueueItem, SetQueueItem, 130 (const lldb::QueueItemSP &)); 131 LLDB_REGISTER_METHOD_CONST(lldb::QueueItemKind, SBQueueItem, GetKind, ()); 132 LLDB_REGISTER_METHOD(void, SBQueueItem, SetKind, (lldb::QueueItemKind)); 133 LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBQueueItem, GetAddress, ()); 134 LLDB_REGISTER_METHOD(void, SBQueueItem, SetAddress, (lldb::SBAddress)); 135 LLDB_REGISTER_METHOD(lldb::SBThread, SBQueueItem, 136 GetExtendedBacktraceThread, (const char *)); 137} 138 139} 140} 141