1 | //===-- MachThreadList.h ----------------------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // Created by Greg Clayton on 6/19/07. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H |
14 | #define LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H |
15 | |
16 | #include "MachThread.h" |
17 | #include "ThreadInfo.h" |
18 | |
19 | class DNBThreadResumeActions; |
20 | |
21 | class MachThreadList { |
22 | public: |
23 | MachThreadList(); |
24 | ~MachThreadList(); |
25 | |
26 | void Clear(); |
27 | void Dump() const; |
28 | bool GetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg, |
29 | DNBRegisterValue *reg_value) const; |
30 | bool SetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg, |
31 | const DNBRegisterValue *reg_value) const; |
32 | nub_size_t GetRegisterContext(nub_thread_t tid, void *buf, size_t buf_len); |
33 | nub_size_t SetRegisterContext(nub_thread_t tid, const void *buf, |
34 | size_t buf_len); |
35 | uint32_t SaveRegisterState(nub_thread_t tid); |
36 | bool RestoreRegisterState(nub_thread_t tid, uint32_t save_id); |
37 | const char *GetThreadInfo(nub_thread_t tid) const; |
38 | void ProcessWillResume(MachProcess *process, |
39 | const DNBThreadResumeActions &thread_actions); |
40 | uint32_t ProcessDidStop(MachProcess *process); |
41 | bool NotifyException(MachException::Data &exc); |
42 | bool ShouldStop(bool &step_more); |
43 | const char *GetName(nub_thread_t tid); |
44 | nub_state_t GetState(nub_thread_t tid); |
45 | nub_thread_t SetCurrentThread(nub_thread_t tid); |
46 | |
47 | ThreadInfo::QoS GetRequestedQoS(nub_thread_t tid, nub_addr_t tsd, |
48 | uint64_t dti_qos_class_index); |
49 | nub_addr_t GetPThreadT(nub_thread_t tid); |
50 | nub_addr_t GetDispatchQueueT(nub_thread_t tid); |
51 | nub_addr_t |
52 | GetTSDAddressForThread(nub_thread_t tid, |
53 | uint64_t plo_pthread_tsd_base_address_offset, |
54 | uint64_t plo_pthread_tsd_base_offset, |
55 | uint64_t plo_pthread_tsd_entry_size); |
56 | |
57 | bool GetThreadStoppedReason(nub_thread_t tid, |
58 | struct DNBThreadStopInfo *stop_info) const; |
59 | void DumpThreadStoppedReason(nub_thread_t tid) const; |
60 | bool GetIdentifierInfo(nub_thread_t tid, |
61 | thread_identifier_info_data_t *ident_info); |
62 | nub_size_t NumThreads() const; |
63 | nub_thread_t ThreadIDAtIndex(nub_size_t idx) const; |
64 | nub_thread_t CurrentThreadID(); |
65 | void CurrentThread(MachThreadSP &threadSP); |
66 | void NotifyBreakpointChanged(const DNBBreakpoint *bp); |
67 | uint32_t EnableHardwareBreakpoint(const DNBBreakpoint *bp) const; |
68 | bool DisableHardwareBreakpoint(const DNBBreakpoint *bp) const; |
69 | uint32_t EnableHardwareWatchpoint(const DNBBreakpoint *wp) const; |
70 | bool DisableHardwareWatchpoint(const DNBBreakpoint *wp) const; |
71 | uint32_t NumSupportedHardwareWatchpoints() const; |
72 | |
73 | uint32_t GetThreadIndexForThreadStoppedWithSignal(const int signo) const; |
74 | |
75 | MachThreadSP GetThreadByID(nub_thread_t tid) const; |
76 | |
77 | MachThreadSP GetThreadByMachPortNumber(thread_t mach_port_number) const; |
78 | nub_thread_t GetThreadIDByMachPortNumber(thread_t mach_port_number) const; |
79 | thread_t GetMachPortNumberByThreadID(nub_thread_t globally_unique_id) const; |
80 | |
81 | protected: |
82 | typedef std::vector<MachThreadSP> collection; |
83 | typedef collection::iterator iterator; |
84 | typedef collection::const_iterator const_iterator; |
85 | |
86 | enum class HardwareBreakpointAction { |
87 | EnableWatchpoint, |
88 | DisableWatchpoint, |
89 | EnableBreakpoint, |
90 | DisableBreakpoint, |
91 | }; |
92 | |
93 | uint32_t DoHardwareBreakpointAction(const DNBBreakpoint *bp, |
94 | HardwareBreakpointAction action) const; |
95 | |
96 | uint32_t UpdateThreadList(MachProcess *process, bool update, |
97 | collection *num_threads = NULL); |
98 | // const_iterator FindThreadByID (thread_t tid) const; |
99 | |
100 | collection m_threads; |
101 | mutable PThreadMutex m_threads_mutex; |
102 | MachThreadSP m_current_thread; |
103 | bool m_is_64_bit; |
104 | }; |
105 | |
106 | #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H |
107 | |