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 20 using namespace lldb; 21 using namespace lldb_private; 22 23 // Constructor 24 25 HistoryThread::HistoryThread(lldb_private::Process &process, lldb::tid_t tid, std::vector<lldb::addr_t> pcs, 26 uint32_t stop_id, bool stop_id_is_valid) 27 : Thread(process, tid, true), 28 m_framelist_mutex(), 29 m_framelist(), 30 m_pcs(pcs), 31 m_stop_id(stop_id), 32 m_stop_id_is_valid(stop_id_is_valid), 33 m_extended_unwind_token(LLDB_INVALID_ADDRESS), 34 m_queue_name(), 35 m_thread_name(), 36 m_originating_unique_thread_id(tid), 37 m_queue_id(LLDB_INVALID_QUEUE_ID) 38 { 39 m_unwinder_ap.reset(new HistoryUnwind(*this, pcs, stop_id_is_valid)); 40 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT)); 41 if (log) 42 log->Printf("%p HistoryThread::HistoryThread", static_cast<void *>(this)); 43 } 44 45 // Destructor 46 47 HistoryThread::~HistoryThread () 48 { 49 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 50 if (log) 51 log->Printf ("%p HistoryThread::~HistoryThread (tid=0x%" PRIx64 ")", 52 static_cast<void*>(this), GetID()); 53 DestroyThread(); 54 } 55 56 lldb::RegisterContextSP 57 HistoryThread::GetRegisterContext () 58 { 59 RegisterContextSP rctx ; 60 if (m_pcs.size() > 0) 61 { 62 rctx.reset (new RegisterContextHistory (*this, 0, GetProcess()->GetAddressByteSize(), m_pcs[0])); 63 } 64 return rctx; 65 66 } 67 68 lldb::RegisterContextSP 69 HistoryThread::CreateRegisterContextForFrame (StackFrame *frame) 70 { 71 return m_unwinder_ap->CreateRegisterContextForFrame (frame); 72 } 73 74 lldb::StackFrameListSP 75 HistoryThread::GetStackFrameList () 76 { 77 // FIXME do not throw away the lock after we acquire it.. 78 std::unique_lock<std::mutex> lock(m_framelist_mutex); 79 lock.unlock(); 80 if (m_framelist.get() == NULL) 81 { 82 m_framelist.reset (new StackFrameList (*this, StackFrameListSP(), true)); 83 } 84 85 return m_framelist; 86 } 87 88 uint32_t 89 HistoryThread::GetExtendedBacktraceOriginatingIndexID () 90 { 91 if (m_originating_unique_thread_id != LLDB_INVALID_THREAD_ID) 92 { 93 if (GetProcess()->HasAssignedIndexIDToThread (m_originating_unique_thread_id)) 94 { 95 return GetProcess()->AssignIndexIDToThread (m_originating_unique_thread_id); 96 } 97 } 98 return LLDB_INVALID_THREAD_ID; 99 } 100