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 180127ef0fSEd Maste QueueItem::QueueItem (QueueSP queue_sp, ProcessSP process_sp, lldb::addr_t item_ref, lldb_private::Address address) : 1912b93ac6SEd Maste m_queue_wp (), 200127ef0fSEd Maste m_process_wp (), 210127ef0fSEd Maste m_item_ref (item_ref), 220127ef0fSEd Maste m_address (address), 230127ef0fSEd Maste m_have_fetched_entire_item (false), 2412b93ac6SEd Maste m_kind (eQueueItemKindUnknown), 2512b93ac6SEd Maste m_item_that_enqueued_this_ref (LLDB_INVALID_ADDRESS), 2612b93ac6SEd Maste m_enqueueing_thread_id (LLDB_INVALID_THREAD_ID), 2712b93ac6SEd Maste m_enqueueing_queue_id (LLDB_INVALID_QUEUE_ID), 2812b93ac6SEd Maste m_target_queue_id (LLDB_INVALID_QUEUE_ID), 2912b93ac6SEd Maste m_stop_id (0), 3012b93ac6SEd Maste m_backtrace(), 3112b93ac6SEd Maste m_thread_label(), 3212b93ac6SEd Maste m_queue_label(), 3312b93ac6SEd Maste m_target_queue_label() 3412b93ac6SEd Maste { 3512b93ac6SEd Maste m_queue_wp = queue_sp; 360127ef0fSEd Maste m_process_wp = process_sp; 3712b93ac6SEd Maste } 3812b93ac6SEd Maste 3912b93ac6SEd Maste QueueItem::~QueueItem () 4012b93ac6SEd Maste { 4112b93ac6SEd Maste } 4212b93ac6SEd Maste 4312b93ac6SEd Maste QueueItemKind 440127ef0fSEd Maste QueueItem::GetKind() 4512b93ac6SEd Maste { 460127ef0fSEd Maste FetchEntireItem (); 4712b93ac6SEd Maste return m_kind; 4812b93ac6SEd Maste } 4912b93ac6SEd Maste 5012b93ac6SEd Maste void 5112b93ac6SEd Maste QueueItem::SetKind (QueueItemKind item_kind) 5212b93ac6SEd Maste { 5312b93ac6SEd Maste m_kind = item_kind; 5412b93ac6SEd Maste } 5512b93ac6SEd Maste 5612b93ac6SEd Maste Address & 5712b93ac6SEd Maste QueueItem::GetAddress () 5812b93ac6SEd Maste { 5912b93ac6SEd Maste return m_address; 6012b93ac6SEd Maste } 6112b93ac6SEd Maste 6212b93ac6SEd Maste void 6312b93ac6SEd Maste QueueItem::SetAddress (Address addr) 6412b93ac6SEd Maste { 6512b93ac6SEd Maste m_address = addr; 6612b93ac6SEd Maste } 6712b93ac6SEd Maste 6812b93ac6SEd Maste ThreadSP 6912b93ac6SEd Maste QueueItem::GetExtendedBacktraceThread (ConstString type) 7012b93ac6SEd Maste { 710127ef0fSEd Maste FetchEntireItem (); 7212b93ac6SEd Maste ThreadSP return_thread; 7312b93ac6SEd Maste QueueSP queue_sp = m_queue_wp.lock(); 7412b93ac6SEd Maste if (queue_sp) 7512b93ac6SEd Maste { 7612b93ac6SEd Maste ProcessSP process_sp = queue_sp->GetProcess(); 7712b93ac6SEd Maste if (process_sp && process_sp->GetSystemRuntime()) 7812b93ac6SEd Maste { 7912b93ac6SEd Maste return_thread = process_sp->GetSystemRuntime()->GetExtendedBacktraceForQueueItem (this->shared_from_this(), type); 8012b93ac6SEd Maste } 8112b93ac6SEd Maste } 8212b93ac6SEd Maste return return_thread; 8312b93ac6SEd Maste } 840127ef0fSEd Maste 850127ef0fSEd Maste lldb::addr_t 860127ef0fSEd Maste QueueItem::GetItemThatEnqueuedThis () 870127ef0fSEd Maste { 880127ef0fSEd Maste FetchEntireItem (); 890127ef0fSEd Maste return m_item_that_enqueued_this_ref; 900127ef0fSEd Maste } 910127ef0fSEd Maste 920127ef0fSEd Maste lldb::tid_t 930127ef0fSEd Maste QueueItem::GetEnqueueingThreadID () 940127ef0fSEd Maste { 950127ef0fSEd Maste FetchEntireItem (); 960127ef0fSEd Maste return m_enqueueing_thread_id; 970127ef0fSEd Maste } 980127ef0fSEd Maste 990127ef0fSEd Maste lldb::queue_id_t 1000127ef0fSEd Maste QueueItem::GetEnqueueingQueueID () 1010127ef0fSEd Maste { 1020127ef0fSEd Maste FetchEntireItem (); 1030127ef0fSEd Maste return m_enqueueing_queue_id; 1040127ef0fSEd Maste } 1050127ef0fSEd Maste 1060127ef0fSEd Maste uint32_t 1070127ef0fSEd Maste QueueItem::GetStopID () 1080127ef0fSEd Maste { 1090127ef0fSEd Maste FetchEntireItem (); 1100127ef0fSEd Maste return m_stop_id; 1110127ef0fSEd Maste } 1120127ef0fSEd Maste 1130127ef0fSEd Maste std::vector<lldb::addr_t> & 1140127ef0fSEd Maste QueueItem::GetEnqueueingBacktrace () 1150127ef0fSEd Maste { 1160127ef0fSEd Maste FetchEntireItem (); 1170127ef0fSEd Maste return m_backtrace; 1180127ef0fSEd Maste } 1190127ef0fSEd Maste 1200127ef0fSEd Maste std::string 1210127ef0fSEd Maste QueueItem::GetThreadLabel () 1220127ef0fSEd Maste { 1230127ef0fSEd Maste FetchEntireItem (); 1240127ef0fSEd Maste return m_thread_label; 1250127ef0fSEd Maste } 1260127ef0fSEd Maste 1270127ef0fSEd Maste std::string 1280127ef0fSEd Maste QueueItem::GetQueueLabel () 1290127ef0fSEd Maste { 1300127ef0fSEd Maste FetchEntireItem (); 1310127ef0fSEd Maste return m_queue_label; 1320127ef0fSEd Maste } 1330127ef0fSEd Maste 1340127ef0fSEd Maste 1350127ef0fSEd Maste ProcessSP 1360127ef0fSEd Maste QueueItem::GetProcessSP() 1370127ef0fSEd Maste { 1380127ef0fSEd Maste return m_process_wp.lock (); 1390127ef0fSEd Maste } 1400127ef0fSEd Maste 1410127ef0fSEd Maste void 1420127ef0fSEd Maste QueueItem::FetchEntireItem() 1430127ef0fSEd Maste { 1440127ef0fSEd Maste if (m_have_fetched_entire_item == true) 1450127ef0fSEd Maste return; 1460127ef0fSEd Maste ProcessSP process_sp = m_process_wp.lock(); 1470127ef0fSEd Maste if (process_sp) 1480127ef0fSEd Maste { 1490127ef0fSEd Maste SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1500127ef0fSEd Maste if (runtime) 1510127ef0fSEd Maste { 1520127ef0fSEd Maste runtime->CompleteQueueItem (this, m_item_ref); 1530127ef0fSEd Maste m_have_fetched_entire_item = true; 1540127ef0fSEd Maste } 1550127ef0fSEd Maste } 1560127ef0fSEd Maste } 157