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