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