1 //===-- QueueItem.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/Target/Queue.h" 11 #include "lldb/Target/Process.h" 12 #include "lldb/Target/QueueItem.h" 13 #include "lldb/Target/SystemRuntime.h" 14 15 using namespace lldb; 16 using namespace lldb_private; 17 18 QueueItem::QueueItem(QueueSP queue_sp, ProcessSP process_sp, 19 lldb::addr_t item_ref, lldb_private::Address address) 20 : m_queue_wp(), m_process_wp(), m_item_ref(item_ref), m_address(address), 21 m_have_fetched_entire_item(false), m_kind(eQueueItemKindUnknown), 22 m_item_that_enqueued_this_ref(LLDB_INVALID_ADDRESS), 23 m_enqueueing_thread_id(LLDB_INVALID_THREAD_ID), 24 m_enqueueing_queue_id(LLDB_INVALID_QUEUE_ID), 25 m_target_queue_id(LLDB_INVALID_QUEUE_ID), m_stop_id(0), m_backtrace(), 26 m_thread_label(), m_queue_label(), m_target_queue_label() { 27 m_queue_wp = queue_sp; 28 m_process_wp = process_sp; 29 } 30 31 QueueItem::~QueueItem() {} 32 33 QueueItemKind QueueItem::GetKind() { 34 FetchEntireItem(); 35 return m_kind; 36 } 37 38 void QueueItem::SetKind(QueueItemKind item_kind) { m_kind = item_kind; } 39 40 Address &QueueItem::GetAddress() { return m_address; } 41 42 void QueueItem::SetAddress(Address addr) { m_address = addr; } 43 44 ThreadSP QueueItem::GetExtendedBacktraceThread(ConstString type) { 45 FetchEntireItem(); 46 ThreadSP return_thread; 47 QueueSP queue_sp = m_queue_wp.lock(); 48 if (queue_sp) { 49 ProcessSP process_sp = queue_sp->GetProcess(); 50 if (process_sp && process_sp->GetSystemRuntime()) { 51 return_thread = 52 process_sp->GetSystemRuntime()->GetExtendedBacktraceForQueueItem( 53 this->shared_from_this(), type); 54 } 55 } 56 return return_thread; 57 } 58 59 lldb::addr_t QueueItem::GetItemThatEnqueuedThis() { 60 FetchEntireItem(); 61 return m_item_that_enqueued_this_ref; 62 } 63 64 lldb::tid_t QueueItem::GetEnqueueingThreadID() { 65 FetchEntireItem(); 66 return m_enqueueing_thread_id; 67 } 68 69 lldb::queue_id_t QueueItem::GetEnqueueingQueueID() { 70 FetchEntireItem(); 71 return m_enqueueing_queue_id; 72 } 73 74 uint32_t QueueItem::GetStopID() { 75 FetchEntireItem(); 76 return m_stop_id; 77 } 78 79 std::vector<lldb::addr_t> &QueueItem::GetEnqueueingBacktrace() { 80 FetchEntireItem(); 81 return m_backtrace; 82 } 83 84 std::string QueueItem::GetThreadLabel() { 85 FetchEntireItem(); 86 return m_thread_label; 87 } 88 89 std::string QueueItem::GetQueueLabel() { 90 FetchEntireItem(); 91 return m_queue_label; 92 } 93 94 ProcessSP QueueItem::GetProcessSP() { return m_process_wp.lock(); } 95 96 void QueueItem::FetchEntireItem() { 97 if (m_have_fetched_entire_item == true) 98 return; 99 ProcessSP process_sp = m_process_wp.lock(); 100 if (process_sp) { 101 SystemRuntime *runtime = process_sp->GetSystemRuntime(); 102 if (runtime) { 103 runtime->CompleteQueueItem(this, m_item_ref); 104 m_have_fetched_entire_item = true; 105 } 106 } 107 } 108