File: MachThreadList.h

package info (click to toggle)
llvm-toolchain-11 1%3A11.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 995,808 kB
  • sloc: cpp: 4,767,656; ansic: 760,916; asm: 477,436; python: 170,940; objc: 69,804; lisp: 29,914; sh: 23,855; f90: 18,173; pascal: 7,551; perl: 7,471; ml: 5,603; awk: 3,489; makefile: 2,573; xml: 915; cs: 573; fortran: 503; javascript: 452
file content (106 lines) | stat: -rw-r--r-- 4,306 bytes parent folder | download | duplicates (19)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//===-- 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 PThreadMutex m_threads_mutex;
  MachThreadSP m_current_thread;
  bool m_is_64_bit;
};

#endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H