blob: 15057b6c0fcd8edde59f96466d07a9d46e35cbaf [file] [log] [blame]
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +00001//===-- ThreadMemory.h ------------------------------------------*- C++ -*-===//
Greg Clayton56d9a1b2011-08-22 02:49:39 +00002//
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#ifndef liblldb_ThreadMemory_h_
11#define liblldb_ThreadMemory_h_
12
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000013// C Includes
14// C++ Includes
15// Other libraries and framework includes
16// Project includes
Greg Clayton56d9a1b2011-08-22 02:49:39 +000017#include "lldb/Target/Thread.h"
18
19class ThreadMemory :
20 public lldb_private::Thread
21{
22public:
Jim Ingham4f465cf2012-10-10 18:32:14 +000023 ThreadMemory (lldb_private::Process &process,
Greg Clayton1ac04c32012-02-21 00:09:25 +000024 lldb::tid_t tid,
25 const lldb::ValueObjectSP &thread_info_valobj_sp);
Greg Clayton56d9a1b2011-08-22 02:49:39 +000026
Jim Ingham4f465cf2012-10-10 18:32:14 +000027 ThreadMemory (lldb_private::Process &process,
Greg Clayton435ce132012-08-24 05:45:15 +000028 lldb::tid_t tid,
29 const char *name,
Greg Claytonead45e02012-10-25 17:56:31 +000030 const char *queue,
31 lldb::addr_t register_data_addr);
Greg Clayton435ce132012-08-24 05:45:15 +000032
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000033 ~ThreadMemory() override;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000034
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000035 lldb::RegisterContextSP
36 GetRegisterContext() override;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000037
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000038 lldb::RegisterContextSP
39 CreateRegisterContextForFrame(lldb_private::StackFrame *frame) override;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000040
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000041 bool
42 CalculateStopInfo() override;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000043
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000044 const char *
45 GetInfo() override
Greg Claytonb3ae8762013-04-12 20:07:46 +000046 {
47 if (m_backing_thread_sp)
48 m_backing_thread_sp->GetInfo();
49 return NULL;
50 }
51
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000052 const char *
53 GetName() override
Greg Clayton435ce132012-08-24 05:45:15 +000054 {
Greg Claytonb3ae8762013-04-12 20:07:46 +000055 if (!m_name.empty())
56 return m_name.c_str();
57 if (m_backing_thread_sp)
58 m_backing_thread_sp->GetName();
59 return NULL;
Greg Clayton435ce132012-08-24 05:45:15 +000060 }
61
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000062 const char *
63 GetQueueName() override
Greg Clayton435ce132012-08-24 05:45:15 +000064 {
Greg Claytonb3ae8762013-04-12 20:07:46 +000065 if (!m_queue.empty())
66 return m_queue.c_str();
67 if (m_backing_thread_sp)
68 m_backing_thread_sp->GetQueueName();
69 return NULL;
Greg Clayton435ce132012-08-24 05:45:15 +000070 }
71
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000072 void
73 WillResume(lldb::StateType resume_state) override;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000074
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000075 void
76 DidResume() override
Greg Claytonb3ae8762013-04-12 20:07:46 +000077 {
78 if (m_backing_thread_sp)
79 m_backing_thread_sp->DidResume();
80 }
Greg Clayton160c9d82013-05-01 21:54:04 +000081
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000082 lldb::user_id_t
83 GetProtocolID() const override
Greg Clayton160c9d82013-05-01 21:54:04 +000084 {
85 if (m_backing_thread_sp)
86 return m_backing_thread_sp->GetProtocolID();
87 return Thread::GetProtocolID();
88 }
Greg Claytonb3ae8762013-04-12 20:07:46 +000089
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000090 void
91 RefreshStateAfterStop() override;
Greg Claytonb3ae8762013-04-12 20:07:46 +000092
Greg Clayton56d9a1b2011-08-22 02:49:39 +000093 lldb::ValueObjectSP &
94 GetValueObject ()
95 {
96 return m_thread_info_valobj_sp;
97 }
Greg Claytonb3ae8762013-04-12 20:07:46 +000098
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000099 void
100 ClearStackFrames() override;
Greg Clayton160c9d82013-05-01 21:54:04 +0000101
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000102 void
103 ClearBackingThread() override
Greg Claytonb3ae8762013-04-12 20:07:46 +0000104 {
105 m_backing_thread_sp.reset();
106 }
107
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000108 bool
109 SetBackingThread(const lldb::ThreadSP &thread_sp) override
Greg Claytonb3ae8762013-04-12 20:07:46 +0000110 {
Greg Clayton160c9d82013-05-01 21:54:04 +0000111 //printf ("Thread 0x%llx is being backed by thread 0x%llx\n", GetID(), thread_sp->GetID());
Greg Claytonb3ae8762013-04-12 20:07:46 +0000112 m_backing_thread_sp = thread_sp;
113 return (bool)thread_sp;
114 }
Greg Claytond1d06e42013-04-20 00:27:58 +0000115
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000116 lldb::ThreadSP
117 GetBackingThread() const override
Greg Claytond1d06e42013-04-20 00:27:58 +0000118 {
119 return m_backing_thread_sp;
120 }
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000121
122protected:
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000123 bool
124 IsOperatingSystemPluginThread() const override
Greg Clayton160c9d82013-05-01 21:54:04 +0000125 {
126 return true;
127 }
128
Greg Claytonb3ae8762013-04-12 20:07:46 +0000129 // If this memory thread is actually represented by a thread from the
130 // lldb_private::Process subclass, then fill in the thread here and
131 // all APIs will be routed through this thread object. If m_backing_thread_sp
132 // is empty, then this thread is simply in memory with no representation
133 // through the process plug-in.
134 lldb::ThreadSP m_backing_thread_sp;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000135 lldb::ValueObjectSP m_thread_info_valobj_sp;
Greg Clayton435ce132012-08-24 05:45:15 +0000136 std::string m_name;
137 std::string m_queue;
Greg Claytonead45e02012-10-25 17:56:31 +0000138 lldb::addr_t m_register_data_addr;
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000139
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000140private:
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000141 DISALLOW_COPY_AND_ASSIGN (ThreadMemory);
142};
143
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000144#endif // liblldb_ThreadMemory_h_