HistoryThread.cpp revision 269024
1//===-- HistoryThread.cpp ---------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "lldb/lldb-private.h" 11 12#include "Plugins/Process/Utility/HistoryUnwind.h" 13#include "Plugins/Process/Utility/HistoryThread.h" 14#include "Plugins/Process/Utility/RegisterContextHistory.h" 15 16#include "lldb/Core/Log.h" 17#include "lldb/Target/StackFrameList.h" 18#include "lldb/Target/Process.h" 19 20using namespace lldb; 21using namespace lldb_private; 22 23HistoryThread::HistoryThread (lldb_private::Process &process, 24 lldb::tid_t tid, 25 std::vector<lldb::addr_t> pcs, 26 uint32_t stop_id, 27 bool stop_id_is_valid) : 28 Thread (process, tid), 29 m_framelist_mutex(), 30 m_framelist(), 31 m_pcs (pcs), 32 m_stop_id (stop_id), 33 m_stop_id_is_valid (stop_id_is_valid), 34 m_extended_unwind_token (LLDB_INVALID_ADDRESS), 35 m_queue_name (), 36 m_thread_name (), 37 m_originating_unique_thread_id (tid), 38 m_queue_id (LLDB_INVALID_QUEUE_ID) 39{ 40 m_unwinder_ap.reset (new HistoryUnwind (*this, pcs, stop_id, stop_id_is_valid)); 41 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 42 if (log) 43 log->Printf ("%p HistoryThread::HistoryThread", this); 44} 45 46HistoryThread::~HistoryThread () 47{ 48 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 49 if (log) 50 log->Printf ("%p HistoryThread::~HistoryThread (tid=0x%" PRIx64 ")", this, GetID()); 51 DestroyThread(); 52} 53 54lldb::RegisterContextSP 55HistoryThread::GetRegisterContext () 56{ 57 RegisterContextSP rctx ; 58 if (m_pcs.size() > 0) 59 { 60 rctx.reset (new RegisterContextHistory (*this, 0, GetProcess()->GetAddressByteSize(), m_pcs[0])); 61 } 62 return rctx; 63 64} 65 66lldb::RegisterContextSP 67HistoryThread::CreateRegisterContextForFrame (StackFrame *frame) 68{ 69 return m_unwinder_ap->CreateRegisterContextForFrame (frame); 70} 71 72lldb::StackFrameListSP 73HistoryThread::GetStackFrameList () 74{ 75 Mutex::Locker (m_framelist_mutex); 76 if (m_framelist.get() == NULL) 77 { 78 m_framelist.reset (new StackFrameList (*this, StackFrameListSP(), true)); 79 } 80 81 return m_framelist; 82} 83 84uint32_t 85HistoryThread::GetExtendedBacktraceOriginatingIndexID () 86{ 87 if (m_originating_unique_thread_id != LLDB_INVALID_THREAD_ID) 88 { 89 if (GetProcess()->HasAssignedIndexIDToThread (m_originating_unique_thread_id)) 90 { 91 return GetProcess()->AssignIndexIDToThread (m_originating_unique_thread_id); 92 } 93 } 94 return LLDB_INVALID_THREAD_ID; 95} 96