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