1258882Semaste//===-- HistoryThread.h -----------------------------------------*- C++ -*-===//
2258882Semaste//
3258882Semaste//                     The LLVM Compiler Infrastructure
4258882Semaste//
5258882Semaste// This file is distributed under the University of Illinois Open Source
6258882Semaste// License. See LICENSE.TXT for details.
7258882Semaste//
8258882Semaste//===----------------------------------------------------------------------===//
9258882Semaste
10258882Semaste#ifndef liblldb_HistoryThread_h_
11258882Semaste#define liblldb_HistoryThread_h_
12258882Semaste
13258882Semaste#include "lldb/lldb-private.h"
14258882Semaste#include "lldb/Host/Mutex.h"
15258882Semaste#include "lldb/Core/Broadcaster.h"
16258882Semaste#include "lldb/Core/Event.h"
17258882Semaste#include "lldb/Core/UserID.h"
18258882Semaste#include "lldb/Core/UserSettingsController.h"
19258882Semaste#include "lldb/Target/ExecutionContextScope.h"
20258882Semaste#include "lldb/Target/StackFrameList.h"
21258882Semaste#include "lldb/Target/Thread.h"
22258882Semaste
23258882Semastenamespace lldb_private {
24258882Semaste
25269024Semaste//----------------------------------------------------------------------
26269024Semaste/// @class HistoryThread HistoryThread.h "HistoryThread.h"
27269024Semaste/// @brief A thread object representing a backtrace from a previous point in the process execution
28269024Semaste///
29269024Semaste/// This subclass of Thread is used to provide a backtrace from earlier in
30269024Semaste/// process execution.  It is given a backtrace list of pc addresses and
31269024Semaste/// optionally a stop_id of when those pc addresses were collected, and it will
32269024Semaste/// create stack frames for them.
33269024Semaste//----------------------------------------------------------------------
34269024Semaste
35258882Semasteclass HistoryThread : public lldb_private::Thread
36258882Semaste{
37258882Semastepublic:
38258882Semaste    HistoryThread (lldb_private::Process &process, lldb::tid_t tid, std::vector<lldb::addr_t> pcs, uint32_t stop_id, bool stop_id_is_valid);
39258882Semaste
40258882Semaste    virtual ~HistoryThread ();
41258882Semaste
42258882Semaste    virtual lldb::RegisterContextSP
43258882Semaste    GetRegisterContext ();
44258882Semaste
45258882Semaste    virtual lldb::RegisterContextSP
46258882Semaste    CreateRegisterContextForFrame (StackFrame *frame);
47258882Semaste
48258882Semaste    virtual void
49258882Semaste    RefreshStateAfterStop() { }
50258882Semaste
51258882Semaste    bool
52258882Semaste    CalculateStopInfo () { return false; }
53258882Semaste
54258882Semaste    void
55258882Semaste    SetExtendedBacktraceToken (uint64_t token)
56258882Semaste    {
57258882Semaste        m_extended_unwind_token = token;
58258882Semaste    }
59258882Semaste
60258882Semaste    uint64_t
61258882Semaste    GetExtendedBacktraceToken ()
62258882Semaste    {
63258882Semaste        return m_extended_unwind_token;
64258882Semaste    }
65258882Semaste
66258882Semaste    const char *
67258882Semaste    GetQueueName ()
68258882Semaste    {
69258882Semaste        return m_queue_name.c_str();
70258882Semaste    }
71258882Semaste
72258882Semaste    void
73258882Semaste    SetQueueName (const char *name)
74258882Semaste    {
75258882Semaste        m_queue_name = name;
76258882Semaste    }
77258882Semaste
78258882Semaste    lldb::queue_id_t
79258882Semaste    GetQueueID ()
80258882Semaste    {
81258882Semaste        return m_queue_id;
82258882Semaste    }
83258882Semaste
84258882Semaste    void
85258882Semaste    SetQueueID (lldb::queue_id_t queue)
86258882Semaste    {
87258882Semaste        m_queue_id = queue;
88258882Semaste    }
89258882Semaste
90258882Semaste    const char *
91258882Semaste    GetThreadName ()
92258882Semaste    {
93258882Semaste        return m_thread_name.c_str();
94258882Semaste    }
95258882Semaste
96258882Semaste    uint32_t
97258882Semaste    GetExtendedBacktraceOriginatingIndexID ();
98258882Semaste
99258882Semaste    void
100258882Semaste    SetThreadName (const char *name)
101258882Semaste    {
102258882Semaste        m_thread_name = name;
103258882Semaste    }
104258882Semaste
105258882Semasteprotected:
106258882Semaste    virtual lldb::StackFrameListSP
107258882Semaste    GetStackFrameList ();
108258882Semaste
109258882Semaste    mutable Mutex               m_framelist_mutex;
110258882Semaste    lldb::StackFrameListSP      m_framelist;
111258882Semaste    std::vector<lldb::addr_t>   m_pcs;
112258882Semaste    uint32_t                    m_stop_id;
113258882Semaste    bool                        m_stop_id_is_valid;
114258882Semaste
115258882Semaste    uint64_t                    m_extended_unwind_token;
116258882Semaste    std::string                 m_queue_name;
117258882Semaste    std::string                 m_thread_name;
118258882Semaste    lldb::tid_t                 m_originating_unique_thread_id;
119258882Semaste    lldb::queue_id_t            m_queue_id;
120258882Semaste};
121258882Semaste
122258882Semaste} // namespace lldb_private
123258882Semaste
124258882Semaste#endif  // liblldb_HistoryThread_h_
125