mirror of
https://github.com/intel/llvm.git
synced 2026-01-15 20:54:40 +08:00
libldi library to collect extended backtrace information; switch to the libBacktraceRecording library and its APIs. Complete the work of adding QueueItems to Queues and allow for the QueueItems to be interrogated about their extended backtraces in turn. There's still cleanup and documentation to do on this code but the code is functional and I it's a good time to get the work-in-progress checked in. <rdar://problem/15314027> llvm-svn: 200822
128 lines
2.5 KiB
C++
128 lines
2.5 KiB
C++
//===-- Queue.cpp -----------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Target/Process.h"
|
|
#include "lldb/Target/Queue.h"
|
|
#include "lldb/Target/QueueList.h"
|
|
#include "lldb/Target/Thread.h"
|
|
#include "lldb/Target/SystemRuntime.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
Queue::Queue (ProcessSP process_sp, lldb::queue_id_t queue_id, const char *queue_name) :
|
|
m_process_wp (),
|
|
m_queue_id (queue_id),
|
|
m_queue_name (),
|
|
m_running_work_items_count(0),
|
|
m_pending_work_items_count(0),
|
|
m_pending_items(),
|
|
m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS)
|
|
{
|
|
if (queue_name)
|
|
m_queue_name = queue_name;
|
|
|
|
m_process_wp = process_sp;
|
|
}
|
|
|
|
Queue::~Queue ()
|
|
{
|
|
}
|
|
|
|
queue_id_t
|
|
Queue::GetID ()
|
|
{
|
|
return m_queue_id;
|
|
}
|
|
|
|
const char *
|
|
Queue::GetName ()
|
|
{
|
|
const char *result = NULL;
|
|
if (m_queue_name.size() > 0)
|
|
result = m_queue_name.c_str();
|
|
return result;
|
|
}
|
|
|
|
uint32_t
|
|
Queue::GetIndexID ()
|
|
{
|
|
return m_queue_id;
|
|
}
|
|
|
|
std::vector<lldb::ThreadSP>
|
|
Queue::GetThreads ()
|
|
{
|
|
std::vector<ThreadSP> result;
|
|
ProcessSP process_sp = m_process_wp.lock();
|
|
if (process_sp.get ())
|
|
{
|
|
for (ThreadSP thread_sp : process_sp->Threads())
|
|
{
|
|
if (thread_sp->GetQueueID() == m_queue_id)
|
|
{
|
|
result.push_back (thread_sp);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void
|
|
Queue::SetNumRunningWorkItems (uint32_t count)
|
|
{
|
|
m_running_work_items_count = count;
|
|
}
|
|
|
|
uint32_t
|
|
Queue::GetNumRunningWorkItems () const
|
|
{
|
|
return m_running_work_items_count;
|
|
}
|
|
|
|
|
|
void
|
|
Queue::SetNumPendingWorkItems (uint32_t count)
|
|
{
|
|
m_pending_work_items_count = count;
|
|
}
|
|
|
|
uint32_t
|
|
Queue::GetNumPendingWorkItems () const
|
|
{
|
|
return m_pending_work_items_count;
|
|
}
|
|
|
|
void
|
|
Queue::SetLibdispatchQueueAddress (addr_t dispatch_queue_t_addr)
|
|
{
|
|
m_dispatch_queue_t_addr = dispatch_queue_t_addr;
|
|
}
|
|
|
|
addr_t
|
|
Queue::GetLibdispatchQueueAddress () const
|
|
{
|
|
return m_dispatch_queue_t_addr;
|
|
}
|
|
|
|
|
|
const std::vector<lldb::QueueItemSP> &
|
|
Queue::GetPendingItems ()
|
|
{
|
|
if (m_pending_items.size() == 0)
|
|
{
|
|
ProcessSP process_sp = m_process_wp.lock();
|
|
if (process_sp && process_sp->GetSystemRuntime())
|
|
{
|
|
process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue (this);
|
|
}
|
|
}
|
|
return m_pending_items;
|
|
}
|