1 //===-- SBQueueItem.cpp -----------------------------------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "lldb/lldb-forward.h"
11
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/Core/Log.h"
17 #include "lldb/Target/Process.h"
18 #include "lldb/Target/QueueItem.h"
19 #include "lldb/Target/Thread.h"
20
21 using namespace lldb;
22 using namespace lldb_private;
23
24 //----------------------------------------------------------------------
25 // Constructors
26 //----------------------------------------------------------------------
SBQueueItem()27 SBQueueItem::SBQueueItem () :
28 m_queue_item_sp()
29 {
30 }
31
SBQueueItem(const QueueItemSP & queue_item_sp)32 SBQueueItem::SBQueueItem (const QueueItemSP& queue_item_sp) :
33 m_queue_item_sp (queue_item_sp)
34 {
35 }
36
37 //----------------------------------------------------------------------
38 // Destructor
39 //----------------------------------------------------------------------
~SBQueueItem()40 SBQueueItem::~SBQueueItem()
41 {
42 m_queue_item_sp.reset();
43 }
44
45 bool
IsValid() const46 SBQueueItem::IsValid() const
47 {
48 bool is_valid = m_queue_item_sp.get() != NULL;
49 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
50 if (log)
51 log->Printf("SBQueueItem(%p)::IsValid() == %s",
52 static_cast<void*>(m_queue_item_sp.get()),
53 is_valid ? "true" : "false");
54 return is_valid;
55 }
56
57
58 void
Clear()59 SBQueueItem::Clear ()
60 {
61 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
62 if (log)
63 log->Printf("SBQueueItem(%p)::Clear()",
64 static_cast<void*>(m_queue_item_sp.get()));
65 m_queue_item_sp.reset();
66 }
67
68
69 void
SetQueueItem(const QueueItemSP & queue_item_sp)70 SBQueueItem::SetQueueItem (const QueueItemSP& queue_item_sp)
71 {
72 m_queue_item_sp = queue_item_sp;
73 }
74
75
76 lldb::QueueItemKind
GetKind() const77 SBQueueItem::GetKind () const
78 {
79 QueueItemKind result = eQueueItemKindUnknown;
80 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
81 if (m_queue_item_sp)
82 {
83 result = m_queue_item_sp->GetKind ();
84 }
85 if (log)
86 log->Printf("SBQueueItem(%p)::GetKind() == %d",
87 static_cast<void*>(m_queue_item_sp.get()),
88 static_cast<int>(result));
89 return result;
90 }
91
92 void
SetKind(lldb::QueueItemKind kind)93 SBQueueItem::SetKind (lldb::QueueItemKind kind)
94 {
95 if (m_queue_item_sp)
96 {
97 m_queue_item_sp->SetKind (kind);
98 }
99 }
100
101 SBAddress
GetAddress() const102 SBQueueItem::GetAddress () const
103 {
104 SBAddress result;
105 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
106 if (m_queue_item_sp)
107 {
108 result.SetAddress (&m_queue_item_sp->GetAddress());
109 }
110 if (log)
111 {
112 StreamString sstr;
113 const Address *addr = result.get();
114 if (addr)
115 addr->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
116 log->Printf ("SBQueueItem(%p)::GetAddress() == SBAddress(%p): %s",
117 static_cast<void*>(m_queue_item_sp.get()),
118 static_cast<void*>(result.get()), sstr.GetData());
119 }
120 return result;
121 }
122
123 void
SetAddress(SBAddress addr)124 SBQueueItem::SetAddress (SBAddress addr)
125 {
126 if (m_queue_item_sp)
127 {
128 m_queue_item_sp->SetAddress (addr.ref());
129 }
130 }
131
132 SBThread
GetExtendedBacktraceThread(const char * type)133 SBQueueItem::GetExtendedBacktraceThread (const char *type)
134 {
135 SBThread result;
136 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
137 if (m_queue_item_sp)
138 {
139 ProcessSP process_sp = m_queue_item_sp->GetProcessSP();
140 Process::StopLocker stop_locker;
141 if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock()))
142 {
143 ThreadSP thread_sp;
144 ConstString type_const (type);
145 thread_sp = m_queue_item_sp->GetExtendedBacktraceThread (type_const);
146 if (thread_sp)
147 {
148 // Save this in the Process' ExtendedThreadList so a strong pointer retains the
149 // object
150 process_sp->GetExtendedThreadList().AddThread (thread_sp);
151 result.SetThread (thread_sp);
152 if (log)
153 {
154 const char *queue_name = thread_sp->GetQueueName();
155 if (queue_name == NULL)
156 queue_name = "";
157 log->Printf ("SBQueueItem(%p)::GetExtendedBacktraceThread() = new extended Thread created (%p) with queue_id 0x%" PRIx64 " queue name '%s'",
158 static_cast<void*>(m_queue_item_sp.get()),
159 static_cast<void*>(thread_sp.get()),
160 static_cast<uint64_t>(thread_sp->GetQueueID()),
161 queue_name);
162 }
163 }
164 }
165 }
166 return result;
167 }
168