112b93ac6SEd Maste //===-- QueueItem.cpp -------------------------------------------*- C++ -*-===//
212b93ac6SEd Maste //
312b93ac6SEd Maste //                     The LLVM Compiler Infrastructure
412b93ac6SEd Maste //
512b93ac6SEd Maste // This file is distributed under the University of Illinois Open Source
612b93ac6SEd Maste // License. See LICENSE.TXT for details.
712b93ac6SEd Maste //
812b93ac6SEd Maste //===----------------------------------------------------------------------===//
912b93ac6SEd Maste 
1012b93ac6SEd Maste #include "lldb/Target/Queue.h"
1112b93ac6SEd Maste #include "lldb/Target/Process.h"
1212b93ac6SEd Maste #include "lldb/Target/QueueItem.h"
1312b93ac6SEd Maste #include "lldb/Target/SystemRuntime.h"
1412b93ac6SEd Maste 
1512b93ac6SEd Maste using namespace lldb;
1612b93ac6SEd Maste using namespace lldb_private;
1712b93ac6SEd Maste 
QueueItem(QueueSP queue_sp,ProcessSP process_sp,lldb::addr_t item_ref,lldb_private::Address address)18435933ddSDimitry Andric QueueItem::QueueItem(QueueSP queue_sp, ProcessSP process_sp,
19435933ddSDimitry Andric                      lldb::addr_t item_ref, lldb_private::Address address)
20435933ddSDimitry Andric     : m_queue_wp(), m_process_wp(), m_item_ref(item_ref), m_address(address),
21435933ddSDimitry Andric       m_have_fetched_entire_item(false), m_kind(eQueueItemKindUnknown),
2212b93ac6SEd Maste       m_item_that_enqueued_this_ref(LLDB_INVALID_ADDRESS),
2312b93ac6SEd Maste       m_enqueueing_thread_id(LLDB_INVALID_THREAD_ID),
2412b93ac6SEd Maste       m_enqueueing_queue_id(LLDB_INVALID_QUEUE_ID),
25435933ddSDimitry Andric       m_target_queue_id(LLDB_INVALID_QUEUE_ID), m_stop_id(0), m_backtrace(),
26435933ddSDimitry Andric       m_thread_label(), m_queue_label(), m_target_queue_label() {
2712b93ac6SEd Maste   m_queue_wp = queue_sp;
280127ef0fSEd Maste   m_process_wp = process_sp;
2912b93ac6SEd Maste }
3012b93ac6SEd Maste 
~QueueItem()31435933ddSDimitry Andric QueueItem::~QueueItem() {}
3212b93ac6SEd Maste 
GetKind()33435933ddSDimitry Andric QueueItemKind QueueItem::GetKind() {
340127ef0fSEd Maste   FetchEntireItem();
3512b93ac6SEd Maste   return m_kind;
3612b93ac6SEd Maste }
3712b93ac6SEd Maste 
SetKind(QueueItemKind item_kind)38435933ddSDimitry Andric void QueueItem::SetKind(QueueItemKind item_kind) { m_kind = item_kind; }
3912b93ac6SEd Maste 
GetAddress()40435933ddSDimitry Andric Address &QueueItem::GetAddress() { return m_address; }
4112b93ac6SEd Maste 
SetAddress(Address addr)42435933ddSDimitry Andric void QueueItem::SetAddress(Address addr) { m_address = addr; }
4312b93ac6SEd Maste 
GetExtendedBacktraceThread(ConstString type)44435933ddSDimitry Andric ThreadSP QueueItem::GetExtendedBacktraceThread(ConstString type) {
450127ef0fSEd Maste   FetchEntireItem();
4612b93ac6SEd Maste   ThreadSP return_thread;
4712b93ac6SEd Maste   QueueSP queue_sp = m_queue_wp.lock();
48435933ddSDimitry Andric   if (queue_sp) {
4912b93ac6SEd Maste     ProcessSP process_sp = queue_sp->GetProcess();
50435933ddSDimitry Andric     if (process_sp && process_sp->GetSystemRuntime()) {
51435933ddSDimitry Andric       return_thread =
52435933ddSDimitry Andric           process_sp->GetSystemRuntime()->GetExtendedBacktraceForQueueItem(
53435933ddSDimitry Andric               this->shared_from_this(), type);
5412b93ac6SEd Maste     }
5512b93ac6SEd Maste   }
5612b93ac6SEd Maste   return return_thread;
5712b93ac6SEd Maste }
580127ef0fSEd Maste 
GetItemThatEnqueuedThis()59435933ddSDimitry Andric lldb::addr_t QueueItem::GetItemThatEnqueuedThis() {
600127ef0fSEd Maste   FetchEntireItem();
610127ef0fSEd Maste   return m_item_that_enqueued_this_ref;
620127ef0fSEd Maste }
630127ef0fSEd Maste 
GetEnqueueingThreadID()64435933ddSDimitry Andric lldb::tid_t QueueItem::GetEnqueueingThreadID() {
650127ef0fSEd Maste   FetchEntireItem();
660127ef0fSEd Maste   return m_enqueueing_thread_id;
670127ef0fSEd Maste }
680127ef0fSEd Maste 
GetEnqueueingQueueID()69435933ddSDimitry Andric lldb::queue_id_t QueueItem::GetEnqueueingQueueID() {
700127ef0fSEd Maste   FetchEntireItem();
710127ef0fSEd Maste   return m_enqueueing_queue_id;
720127ef0fSEd Maste }
730127ef0fSEd Maste 
GetStopID()74435933ddSDimitry Andric uint32_t QueueItem::GetStopID() {
750127ef0fSEd Maste   FetchEntireItem();
760127ef0fSEd Maste   return m_stop_id;
770127ef0fSEd Maste }
780127ef0fSEd Maste 
GetEnqueueingBacktrace()79435933ddSDimitry Andric std::vector<lldb::addr_t> &QueueItem::GetEnqueueingBacktrace() {
800127ef0fSEd Maste   FetchEntireItem();
810127ef0fSEd Maste   return m_backtrace;
820127ef0fSEd Maste }
830127ef0fSEd Maste 
GetThreadLabel()84435933ddSDimitry Andric std::string QueueItem::GetThreadLabel() {
850127ef0fSEd Maste   FetchEntireItem();
860127ef0fSEd Maste   return m_thread_label;
870127ef0fSEd Maste }
880127ef0fSEd Maste 
GetQueueLabel()89435933ddSDimitry Andric std::string QueueItem::GetQueueLabel() {
900127ef0fSEd Maste   FetchEntireItem();
910127ef0fSEd Maste   return m_queue_label;
920127ef0fSEd Maste }
930127ef0fSEd Maste 
GetProcessSP()94435933ddSDimitry Andric ProcessSP QueueItem::GetProcessSP() { return m_process_wp.lock(); }
950127ef0fSEd Maste 
FetchEntireItem()96435933ddSDimitry Andric void QueueItem::FetchEntireItem() {
97*b5893f02SDimitry Andric   if (m_have_fetched_entire_item)
980127ef0fSEd Maste     return;
990127ef0fSEd Maste   ProcessSP process_sp = m_process_wp.lock();
100435933ddSDimitry Andric   if (process_sp) {
1010127ef0fSEd Maste     SystemRuntime *runtime = process_sp->GetSystemRuntime();
102435933ddSDimitry Andric     if (runtime) {
1030127ef0fSEd Maste       runtime->CompleteQueueItem(this, m_item_ref);
1040127ef0fSEd Maste       m_have_fetched_entire_item = true;
1050127ef0fSEd Maste     }
1060127ef0fSEd Maste   }
1070127ef0fSEd Maste }
108