[Lldb-commits] [lldb] r203449 - Correctly add the QueueID to a pending block's extended thread backtrace thread.
Jason Molenda
jmolenda at apple.com
Mon Mar 10 01:42:04 PDT 2014
Author: jmolenda
Date: Mon Mar 10 03:42:03 2014
New Revision: 203449
URL: http://llvm.org/viewvc/llvm-project?rev=203449&view=rev
Log:
Correctly add the QueueID to a pending block's extended thread backtrace thread.
Seed the QueueItem objects with the item_refs and addresses when they are fetched
in one batch. If additional information is needed from the QueueItem, fetch it
lazily one pending item per function call.
<rdar://problem/16270007>, <rdar://problem/16032150>
Modified:
lldb/trunk/include/lldb/Target/QueueItem.h
lldb/trunk/include/lldb/Target/SystemRuntime.h
lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp
lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h
lldb/trunk/source/Target/QueueItem.cpp
Modified: lldb/trunk/include/lldb/Target/QueueItem.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/QueueItem.h?rev=203449&r1=203448&r2=203449&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/QueueItem.h (original)
+++ lldb/trunk/include/lldb/Target/QueueItem.h Mon Mar 10 03:42:03 2014
@@ -38,7 +38,7 @@ class QueueItem :
{
public:
- QueueItem (lldb::QueueSP queue_sp, lldb::addr_t item_ref);
+ QueueItem (lldb::QueueSP queue_sp, lldb::ProcessSP process_sp, lldb::addr_t item_ref, lldb_private::Address address);
~QueueItem ();
@@ -50,7 +50,7 @@ public:
/// represents. eQueueItemKindUnknown may be returned.
//------------------------------------------------------------------
lldb::QueueItemKind
- GetKind () const;
+ GetKind ();
//------------------------------------------------------------------
/// Set the type of work item this is
@@ -125,10 +125,7 @@ public:
}
lldb::addr_t
- GetItemThatEnqueuedThis ()
- {
- return m_item_that_enqueued_this_ref;
- }
+ GetItemThatEnqueuedThis ();
void
SetEnqueueingThreadID (lldb::tid_t tid)
@@ -137,10 +134,7 @@ public:
}
lldb::tid_t
- GetEnqueueingThreadID ()
- {
- return m_enqueueing_thread_id;
- }
+ GetEnqueueingThreadID ();
void
SetEnqueueingQueueID (lldb::queue_id_t qid)
@@ -149,10 +143,7 @@ public:
}
lldb::queue_id_t
- GetEnqueueingQueueID ()
- {
- return m_enqueueing_queue_id;
- }
+ GetEnqueueingQueueID ();
void
SetTargetQueueID (lldb::queue_id_t qid)
@@ -167,10 +158,7 @@ public:
}
uint32_t
- GetStopID ()
- {
- return m_stop_id;
- }
+ GetStopID ();
void
SetEnqueueingBacktrace (std::vector<lldb::addr_t> backtrace)
@@ -179,10 +167,7 @@ public:
}
std::vector<lldb::addr_t> &
- GetEnqueueingBacktrace ()
- {
- return m_backtrace;
- }
+ GetEnqueueingBacktrace ();
void
SetThreadLabel (std::string thread_name)
@@ -191,10 +176,7 @@ public:
}
std::string
- GetThreadLabel ()
- {
- return m_thread_label;
- }
+ GetThreadLabel ();
void
SetQueueLabel (std::string queue_name)
@@ -203,10 +185,7 @@ public:
}
std::string
- GetQueueLabel ()
- {
- return m_queue_label;
- }
+ GetQueueLabel ();
void
SetTargetQueueLabel (std::string queue_name)
@@ -218,11 +197,18 @@ public:
GetProcessSP ();
protected:
+ void
+ FetchEntireItem ();
+
+
lldb::QueueWP m_queue_wp;
- lldb::QueueItemKind m_kind;
- lldb_private::Address m_address;
+ lldb::ProcessWP m_process_wp;
lldb::addr_t m_item_ref; // the token we can be used to fetch more information about this queue item
+ lldb_private::Address m_address;
+ bool m_have_fetched_entire_item;
+
+ lldb::QueueItemKind m_kind;
lldb::addr_t m_item_that_enqueued_this_ref; // a handle that we can pass into libBacktraceRecording
// to get the QueueItem that enqueued this item
lldb::tid_t m_enqueueing_thread_id; // thread that enqueued this item
Modified: lldb/trunk/include/lldb/Target/SystemRuntime.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/SystemRuntime.h?rev=203449&r1=203448&r2=203449&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/SystemRuntime.h (original)
+++ lldb/trunk/include/lldb/Target/SystemRuntime.h Mon Mar 10 03:42:03 2014
@@ -270,6 +270,25 @@ public:
{
}
+ //------------------------------------------------------------------
+ /// Complete the fields in a QueueItem
+ ///
+ /// PopulatePendingItemsForQueue() may not fill in all of the QueueItem
+ /// details; when the remaining fields are needed, they will be
+ /// fetched by call this method.
+ ///
+ /// @param [in] queue_item
+ /// The QueueItem that we will be completing.
+ ///
+ /// @param [in] item_ref
+ /// The item_ref token that is needed to retrieve the rest of the
+ /// information about the QueueItem.
+ //------------------------------------------------------------------
+ virtual void
+ CompleteQueueItem (lldb_private::QueueItem *queue_item, lldb::addr_t item_ref)
+ {
+ }
+
protected:
//------------------------------------------------------------------
// Member variables.
Modified: lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp?rev=203449&r1=203448&r2=203449&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp (original)
+++ lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp Mon Mar 10 03:42:03 2014
@@ -620,42 +620,42 @@ SystemRuntimeMacOSX::PopulatePendingItem
PendingItemsForQueue pending_item_refs = GetPendingItemRefsForQueue (queue->GetLibdispatchQueueAddress());
for (ItemRefAndCodeAddress pending_item : pending_item_refs.item_refs_and_code_addresses)
{
- AppleGetItemInfoHandler::GetItemInfoReturnInfo ret;
- ThreadSP cur_thread_sp (m_process->GetThreadList().GetSelectedThread());
- Error error;
- ret = m_get_item_info_handler.GetItemInfo (*cur_thread_sp.get(), pending_item.item_ref, m_page_to_free, m_page_to_free_size, error);
- m_page_to_free = LLDB_INVALID_ADDRESS;
- m_page_to_free_size = 0;
- if (ret.item_buffer_ptr != 0 && ret.item_buffer_ptr != LLDB_INVALID_ADDRESS && ret.item_buffer_size > 0)
- {
- DataBufferHeap data (ret.item_buffer_size, 0);
- if (m_process->ReadMemory (ret.item_buffer_ptr, data.GetBytes(), ret.item_buffer_size, error) && error.Success())
- {
- DataExtractor extractor (data.GetBytes(), data.GetByteSize(), m_process->GetByteOrder(), m_process->GetAddressByteSize());
- ItemInfo item = ExtractItemInfoFromBuffer (extractor);
- QueueItemSP queue_item_sp (new QueueItem (queue->shared_from_this(), pending_item.item_ref));
- queue_item_sp->SetItemThatEnqueuedThis (item.item_that_enqueued_this);
+ Address addr;
+ m_process->GetTarget().ResolveLoadAddress (pending_item.code_address, addr);
+ QueueItemSP queue_item_sp (new QueueItem (queue->shared_from_this(), m_process->shared_from_this(), pending_item.item_ref, addr));
+ queue->PushPendingQueueItem (queue_item_sp);
+ }
+ }
+}
- Address addr;
- if (!m_process->GetTarget().ResolveLoadAddress (item.function_or_block, addr, item.stop_id))
- {
- m_process->GetTarget().ResolveLoadAddress (item.function_or_block, addr);
- }
- queue_item_sp->SetAddress (addr);
- queue_item_sp->SetEnqueueingThreadID (item.enqueuing_thread_id);
- queue_item_sp->SetTargetQueueID (item.enqueuing_thread_id);
- queue_item_sp->SetStopID (item.stop_id);
- queue_item_sp->SetEnqueueingBacktrace (item.enqueuing_callstack);
- queue_item_sp->SetThreadLabel (item.enqueuing_thread_label);
- queue_item_sp->SetQueueLabel (item.enqueuing_queue_label);
- queue_item_sp->SetTargetQueueLabel (item.target_queue_label);
+void
+SystemRuntimeMacOSX::CompleteQueueItem (QueueItem *queue_item, addr_t item_ref)
+{
+ AppleGetItemInfoHandler::GetItemInfoReturnInfo ret;
- queue->PushPendingQueueItem (queue_item_sp);
- }
- m_page_to_free = ret.item_buffer_ptr;
- m_page_to_free_size = ret.item_buffer_size;
- }
+ ThreadSP cur_thread_sp (m_process->GetThreadList().GetSelectedThread());
+ Error error;
+ ret = m_get_item_info_handler.GetItemInfo (*cur_thread_sp.get(), item_ref, m_page_to_free, m_page_to_free_size, error);
+ m_page_to_free = LLDB_INVALID_ADDRESS;
+ m_page_to_free_size = 0;
+ if (ret.item_buffer_ptr != 0 && ret.item_buffer_ptr != LLDB_INVALID_ADDRESS && ret.item_buffer_size > 0)
+ {
+ DataBufferHeap data (ret.item_buffer_size, 0);
+ if (m_process->ReadMemory (ret.item_buffer_ptr, data.GetBytes(), ret.item_buffer_size, error) && error.Success())
+ {
+ DataExtractor extractor (data.GetBytes(), data.GetByteSize(), m_process->GetByteOrder(), m_process->GetAddressByteSize());
+ ItemInfo item = ExtractItemInfoFromBuffer (extractor);
+ queue_item->SetItemThatEnqueuedThis (item.item_that_enqueued_this);
+ queue_item->SetEnqueueingThreadID (item.enqueuing_thread_id);
+ queue_item->SetEnqueueingQueueID (item.enqueuing_queue_serialnum);
+ queue_item->SetStopID (item.stop_id);
+ queue_item->SetEnqueueingBacktrace (item.enqueuing_callstack);
+ queue_item->SetThreadLabel (item.enqueuing_thread_label);
+ queue_item->SetQueueLabel (item.enqueuing_queue_label);
+ queue_item->SetTargetQueueLabel (item.target_queue_label);
}
+ m_page_to_free = ret.item_buffer_ptr;
+ m_page_to_free_size = ret.item_buffer_size;
}
}
Modified: lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h?rev=203449&r1=203448&r2=203449&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h (original)
+++ lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h Mon Mar 10 03:42:03 2014
@@ -100,6 +100,9 @@ public:
void
PopulatePendingItemsForQueue (lldb_private::Queue *queue);
+ void
+ CompleteQueueItem (lldb_private::QueueItem *queue_item, lldb::addr_t item_ref);
+
//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
Modified: lldb/trunk/source/Target/QueueItem.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/QueueItem.cpp?rev=203449&r1=203448&r2=203449&view=diff
==============================================================================
--- lldb/trunk/source/Target/QueueItem.cpp (original)
+++ lldb/trunk/source/Target/QueueItem.cpp Mon Mar 10 03:42:03 2014
@@ -15,11 +15,13 @@
using namespace lldb;
using namespace lldb_private;
-QueueItem::QueueItem (QueueSP queue_sp, lldb::addr_t item_ref) :
+QueueItem::QueueItem (QueueSP queue_sp, ProcessSP process_sp, lldb::addr_t item_ref, lldb_private::Address address) :
m_queue_wp (),
- m_kind (eQueueItemKindUnknown),
- m_address (),
+ m_process_wp (),
m_item_ref (item_ref),
+ m_address (address),
+ m_have_fetched_entire_item (false),
+ m_kind (eQueueItemKindUnknown),
m_item_that_enqueued_this_ref (LLDB_INVALID_ADDRESS),
m_enqueueing_thread_id (LLDB_INVALID_THREAD_ID),
m_enqueueing_queue_id (LLDB_INVALID_QUEUE_ID),
@@ -31,6 +33,7 @@ QueueItem::QueueItem (QueueSP queue_sp,
m_target_queue_label()
{
m_queue_wp = queue_sp;
+ m_process_wp = process_sp;
}
QueueItem::~QueueItem ()
@@ -38,8 +41,9 @@ QueueItem::~QueueItem ()
}
QueueItemKind
-QueueItem::GetKind() const
+QueueItem::GetKind()
{
+ FetchEntireItem ();
return m_kind;
}
@@ -64,6 +68,7 @@ QueueItem::SetAddress (Address addr)
ThreadSP
QueueItem::GetExtendedBacktraceThread (ConstString type)
{
+ FetchEntireItem ();
ThreadSP return_thread;
QueueSP queue_sp = m_queue_wp.lock();
if (queue_sp)
@@ -77,14 +82,75 @@ QueueItem::GetExtendedBacktraceThread (C
return return_thread;
}
+lldb::addr_t
+QueueItem::GetItemThatEnqueuedThis ()
+{
+ FetchEntireItem ();
+ return m_item_that_enqueued_this_ref;
+}
+
+lldb::tid_t
+QueueItem::GetEnqueueingThreadID ()
+{
+ FetchEntireItem ();
+ return m_enqueueing_thread_id;
+}
+
+lldb::queue_id_t
+QueueItem::GetEnqueueingQueueID ()
+{
+ FetchEntireItem ();
+ return m_enqueueing_queue_id;
+}
+
+uint32_t
+QueueItem::GetStopID ()
+{
+ FetchEntireItem ();
+ return m_stop_id;
+}
+
+std::vector<lldb::addr_t> &
+QueueItem::GetEnqueueingBacktrace ()
+{
+ FetchEntireItem ();
+ return m_backtrace;
+}
+
+std::string
+QueueItem::GetThreadLabel ()
+{
+ FetchEntireItem ();
+ return m_thread_label;
+}
+
+std::string
+QueueItem::GetQueueLabel ()
+{
+ FetchEntireItem ();
+ return m_queue_label;
+}
+
+
ProcessSP
QueueItem::GetProcessSP()
{
- ProcessSP process_sp;
- QueueSP queue_sp = m_queue_wp.lock ();
- if (queue_sp)
+ return m_process_wp.lock ();
+}
+
+void
+QueueItem::FetchEntireItem()
+{
+ if (m_have_fetched_entire_item == true)
+ return;
+ ProcessSP process_sp = m_process_wp.lock();
+ if (process_sp)
{
- process_sp = queue_sp->GetProcess();
+ SystemRuntime *runtime = process_sp->GetSystemRuntime();
+ if (runtime)
+ {
+ runtime->CompleteQueueItem (this, m_item_ref);
+ m_have_fetched_entire_item = true;
+ }
}
- return process_sp;
}
More information about the lldb-commits
mailing list