| //===-- MachThreadList.h ----------------------------------------*- C++ -*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Created by Greg Clayton on 6/19/07. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H | |
| #define LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H | |
| #include "MachThread.h" | |
| #include "ThreadInfo.h" | |
| class DNBThreadResumeActions; | |
| class MachThreadList { | |
| public: | |
| MachThreadList(); | |
| ~MachThreadList(); | |
| void Clear(); | |
| void Dump() const; | |
| bool GetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg, | |
| DNBRegisterValue *reg_value) const; | |
| bool SetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg, | |
| const DNBRegisterValue *reg_value) const; | |
| nub_size_t GetRegisterContext(nub_thread_t tid, void *buf, size_t buf_len); | |
| nub_size_t SetRegisterContext(nub_thread_t tid, const void *buf, | |
| size_t buf_len); | |
| uint32_t SaveRegisterState(nub_thread_t tid); | |
| bool RestoreRegisterState(nub_thread_t tid, uint32_t save_id); | |
| const char *GetThreadInfo(nub_thread_t tid) const; | |
| void ProcessWillResume(MachProcess *process, | |
| const DNBThreadResumeActions &thread_actions); | |
| uint32_t ProcessDidStop(MachProcess *process); | |
| bool NotifyException(MachException::Data &exc); | |
| bool ShouldStop(bool &step_more); | |
| const char *GetName(nub_thread_t tid); | |
| nub_state_t GetState(nub_thread_t tid); | |
| nub_thread_t SetCurrentThread(nub_thread_t tid); | |
| ThreadInfo::QoS GetRequestedQoS(nub_thread_t tid, nub_addr_t tsd, | |
| uint64_t dti_qos_class_index); | |
| nub_addr_t GetPThreadT(nub_thread_t tid); | |
| nub_addr_t GetDispatchQueueT(nub_thread_t tid); | |
| nub_addr_t | |
| GetTSDAddressForThread(nub_thread_t tid, | |
| uint64_t plo_pthread_tsd_base_address_offset, | |
| uint64_t plo_pthread_tsd_base_offset, | |
| uint64_t plo_pthread_tsd_entry_size); | |
| bool GetThreadStoppedReason(nub_thread_t tid, | |
| struct DNBThreadStopInfo *stop_info) const; | |
| void DumpThreadStoppedReason(nub_thread_t tid) const; | |
| bool GetIdentifierInfo(nub_thread_t tid, | |
| thread_identifier_info_data_t *ident_info); | |
| nub_size_t NumThreads() const; | |
| nub_thread_t ThreadIDAtIndex(nub_size_t idx) const; | |
| nub_thread_t CurrentThreadID(); | |
| void CurrentThread(MachThreadSP &threadSP); | |
| void NotifyBreakpointChanged(const DNBBreakpoint *bp); | |
| uint32_t EnableHardwareBreakpoint(const DNBBreakpoint *bp) const; | |
| bool DisableHardwareBreakpoint(const DNBBreakpoint *bp) const; | |
| uint32_t EnableHardwareWatchpoint(const DNBBreakpoint *wp) const; | |
| bool DisableHardwareWatchpoint(const DNBBreakpoint *wp) const; | |
| uint32_t NumSupportedHardwareWatchpoints() const; | |
| uint32_t GetThreadIndexForThreadStoppedWithSignal(const int signo) const; | |
| MachThreadSP GetThreadByID(nub_thread_t tid) const; | |
| MachThreadSP GetThreadByMachPortNumber(thread_t mach_port_number) const; | |
| nub_thread_t GetThreadIDByMachPortNumber(thread_t mach_port_number) const; | |
| thread_t GetMachPortNumberByThreadID(nub_thread_t globally_unique_id) const; | |
| protected: | |
| typedef std::vector<MachThreadSP> collection; | |
| typedef collection::iterator iterator; | |
| typedef collection::const_iterator const_iterator; | |
| enum class HardwareBreakpointAction { | |
| EnableWatchpoint, | |
| DisableWatchpoint, | |
| EnableBreakpoint, | |
| DisableBreakpoint, | |
| }; | |
| uint32_t DoHardwareBreakpointAction(const DNBBreakpoint *bp, | |
| HardwareBreakpointAction action) const; | |
| uint32_t UpdateThreadList(MachProcess *process, bool update, | |
| collection *num_threads = NULL); | |
| // const_iterator FindThreadByID (thread_t tid) const; | |
| collection m_threads; | |
| mutable std::recursive_mutex m_threads_mutex; | |
| MachThreadSP m_current_thread; | |
| bool m_is_64_bit; | |
| }; | |
| #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H |