15ffd83dbSDimitry Andric //===-- SBQueueItem.cpp ---------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/lldb-forward.h"
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric #include "SBReproducerPrivate.h"
120b57cec5SDimitry Andric #include "lldb/API/SBAddress.h"
130b57cec5SDimitry Andric #include "lldb/API/SBQueueItem.h"
140b57cec5SDimitry Andric #include "lldb/API/SBThread.h"
150b57cec5SDimitry Andric #include "lldb/Core/Address.h"
160b57cec5SDimitry Andric #include "lldb/Target/Process.h"
170b57cec5SDimitry Andric #include "lldb/Target/QueueItem.h"
180b57cec5SDimitry Andric #include "lldb/Target/Thread.h"
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric using namespace lldb;
210b57cec5SDimitry Andric using namespace lldb_private;
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric // Constructors
SBQueueItem()240b57cec5SDimitry Andric SBQueueItem::SBQueueItem() : m_queue_item_sp() {
250b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBQueueItem);
260b57cec5SDimitry Andric }
270b57cec5SDimitry Andric 
SBQueueItem(const QueueItemSP & queue_item_sp)280b57cec5SDimitry Andric SBQueueItem::SBQueueItem(const QueueItemSP &queue_item_sp)
290b57cec5SDimitry Andric     : m_queue_item_sp(queue_item_sp) {
300b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR(SBQueueItem, (const lldb::QueueItemSP &),
310b57cec5SDimitry Andric                           queue_item_sp);
320b57cec5SDimitry Andric }
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric // Destructor
~SBQueueItem()350b57cec5SDimitry Andric SBQueueItem::~SBQueueItem() { m_queue_item_sp.reset(); }
360b57cec5SDimitry Andric 
IsValid() const370b57cec5SDimitry Andric bool SBQueueItem::IsValid() const {
380b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBQueueItem, IsValid);
390b57cec5SDimitry Andric   return this->operator bool();
400b57cec5SDimitry Andric }
operator bool() const410b57cec5SDimitry Andric SBQueueItem::operator bool() const {
420b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBQueueItem, operator bool);
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric   return m_queue_item_sp.get() != nullptr;
450b57cec5SDimitry Andric }
460b57cec5SDimitry Andric 
Clear()470b57cec5SDimitry Andric void SBQueueItem::Clear() {
480b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(void, SBQueueItem, Clear);
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric   m_queue_item_sp.reset();
510b57cec5SDimitry Andric }
520b57cec5SDimitry Andric 
SetQueueItem(const QueueItemSP & queue_item_sp)530b57cec5SDimitry Andric void SBQueueItem::SetQueueItem(const QueueItemSP &queue_item_sp) {
540b57cec5SDimitry Andric   LLDB_RECORD_METHOD(void, SBQueueItem, SetQueueItem,
550b57cec5SDimitry Andric                      (const lldb::QueueItemSP &), queue_item_sp);
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric   m_queue_item_sp = queue_item_sp;
580b57cec5SDimitry Andric }
590b57cec5SDimitry Andric 
GetKind() const600b57cec5SDimitry Andric lldb::QueueItemKind SBQueueItem::GetKind() const {
610b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::QueueItemKind, SBQueueItem, GetKind);
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   QueueItemKind result = eQueueItemKindUnknown;
640b57cec5SDimitry Andric   if (m_queue_item_sp) {
650b57cec5SDimitry Andric     result = m_queue_item_sp->GetKind();
660b57cec5SDimitry Andric   }
670b57cec5SDimitry Andric   return result;
680b57cec5SDimitry Andric }
690b57cec5SDimitry Andric 
SetKind(lldb::QueueItemKind kind)700b57cec5SDimitry Andric void SBQueueItem::SetKind(lldb::QueueItemKind kind) {
710b57cec5SDimitry Andric   LLDB_RECORD_METHOD(void, SBQueueItem, SetKind, (lldb::QueueItemKind), kind);
720b57cec5SDimitry Andric 
730b57cec5SDimitry Andric   if (m_queue_item_sp) {
740b57cec5SDimitry Andric     m_queue_item_sp->SetKind(kind);
750b57cec5SDimitry Andric   }
760b57cec5SDimitry Andric }
770b57cec5SDimitry Andric 
GetAddress() const780b57cec5SDimitry Andric SBAddress SBQueueItem::GetAddress() const {
790b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBQueueItem, GetAddress);
800b57cec5SDimitry Andric 
810b57cec5SDimitry Andric   SBAddress result;
820b57cec5SDimitry Andric   if (m_queue_item_sp) {
83*af732203SDimitry Andric     result.SetAddress(m_queue_item_sp->GetAddress());
840b57cec5SDimitry Andric   }
850b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(result);
860b57cec5SDimitry Andric }
870b57cec5SDimitry Andric 
SetAddress(SBAddress addr)880b57cec5SDimitry Andric void SBQueueItem::SetAddress(SBAddress addr) {
890b57cec5SDimitry Andric   LLDB_RECORD_METHOD(void, SBQueueItem, SetAddress, (lldb::SBAddress), addr);
900b57cec5SDimitry Andric 
910b57cec5SDimitry Andric   if (m_queue_item_sp) {
920b57cec5SDimitry Andric     m_queue_item_sp->SetAddress(addr.ref());
930b57cec5SDimitry Andric   }
940b57cec5SDimitry Andric }
950b57cec5SDimitry Andric 
GetExtendedBacktraceThread(const char * type)960b57cec5SDimitry Andric SBThread SBQueueItem::GetExtendedBacktraceThread(const char *type) {
970b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThread, SBQueueItem, GetExtendedBacktraceThread,
980b57cec5SDimitry Andric                      (const char *), type);
990b57cec5SDimitry Andric 
1000b57cec5SDimitry Andric   SBThread result;
1010b57cec5SDimitry Andric   if (m_queue_item_sp) {
1020b57cec5SDimitry Andric     ProcessSP process_sp = m_queue_item_sp->GetProcessSP();
1030b57cec5SDimitry Andric     Process::StopLocker stop_locker;
1040b57cec5SDimitry Andric     if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) {
1050b57cec5SDimitry Andric       ThreadSP thread_sp;
1060b57cec5SDimitry Andric       ConstString type_const(type);
1070b57cec5SDimitry Andric       thread_sp = m_queue_item_sp->GetExtendedBacktraceThread(type_const);
1080b57cec5SDimitry Andric       if (thread_sp) {
1090b57cec5SDimitry Andric         // Save this in the Process' ExtendedThreadList so a strong pointer
1100b57cec5SDimitry Andric         // retains the object
1110b57cec5SDimitry Andric         process_sp->GetExtendedThreadList().AddThread(thread_sp);
1120b57cec5SDimitry Andric         result.SetThread(thread_sp);
1130b57cec5SDimitry Andric       }
1140b57cec5SDimitry Andric     }
1150b57cec5SDimitry Andric   }
1160b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(result);
1170b57cec5SDimitry Andric }
1180b57cec5SDimitry Andric 
1190b57cec5SDimitry Andric namespace lldb_private {
1200b57cec5SDimitry Andric namespace repro {
1210b57cec5SDimitry Andric 
1220b57cec5SDimitry Andric template <>
RegisterMethods(Registry & R)1230b57cec5SDimitry Andric void RegisterMethods<SBQueueItem>(Registry &R) {
1240b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBQueueItem, ());
1250b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBQueueItem, (const lldb::QueueItemSP &));
1260b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBQueueItem, IsValid, ());
1270b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBQueueItem, operator bool, ());
1280b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBQueueItem, Clear, ());
1290b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBQueueItem, SetQueueItem,
1300b57cec5SDimitry Andric                        (const lldb::QueueItemSP &));
1310b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(lldb::QueueItemKind, SBQueueItem, GetKind, ());
1320b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBQueueItem, SetKind, (lldb::QueueItemKind));
1330b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBQueueItem, GetAddress, ());
1340b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBQueueItem, SetAddress, (lldb::SBAddress));
1350b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThread, SBQueueItem,
1360b57cec5SDimitry Andric                        GetExtendedBacktraceThread, (const char *));
1370b57cec5SDimitry Andric }
1380b57cec5SDimitry Andric 
1390b57cec5SDimitry Andric }
1400b57cec5SDimitry Andric }
141