Files
llvm/lldb/source/Target/Queue.cpp
Jason Molenda 2fd83355a8 Change the Mac OS X SystemRuntime plugin from using the placeholder
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
2014-02-05 05:44:54 +00:00

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;
}