| /* Inferior process information for the remote server for GDB. |
| Copyright (C) 1993-2024 Free Software Foundation, Inc. |
| |
| This file is part of GDB. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
| |
| #ifndef GDBSERVER_INFERIORS_H |
| #define GDBSERVER_INFERIORS_H |
| |
| #include "gdbsupport/owning_intrusive_list.h" |
| #include "gdbsupport/unordered_map.h" |
| |
| #include "dll.h" |
| |
| struct thread_info; |
| struct regcache; |
| struct target_desc; |
| struct sym_cache; |
| struct breakpoint; |
| struct raw_breakpoint; |
| struct fast_tracepoint_jump; |
| struct process_info_private; |
| struct process_info; |
| |
| extern owning_intrusive_list<process_info> all_processes; |
| |
| struct process_info : public intrusive_list_node<process_info> |
| { |
| process_info (int pid_, int attached_) |
| : pid (pid_), attached (attached_) |
| {} |
| |
| /* This process' pid. */ |
| int pid; |
| |
| /* Nonzero if this child process was attached rather than |
| spawned. */ |
| int attached; |
| |
| /* True if GDB asked us to detach from this process, but we remained |
| attached anyway. */ |
| int gdb_detached = 0; |
| |
| /* The symbol cache. */ |
| struct sym_cache *symbol_cache = NULL; |
| |
| /* The list of memory breakpoints. */ |
| struct breakpoint *breakpoints = NULL; |
| |
| /* The list of raw memory breakpoints. */ |
| struct raw_breakpoint *raw_breakpoints = NULL; |
| |
| /* The list of installed fast tracepoints. */ |
| struct fast_tracepoint_jump *fast_tracepoint_jumps = NULL; |
| |
| /* The list of syscalls to report, or just a single element, ANY_SYSCALL, |
| for unfiltered syscall reporting. */ |
| std::vector<int> syscalls_to_catch; |
| |
| const struct target_desc *tdesc = NULL; |
| |
| /* Private target data. */ |
| struct process_info_private *priv = NULL; |
| |
| /* DLLs that are loaded for this proc. */ |
| std::list<dll_info> all_dlls; |
| |
| /* Flag to mark that the DLL list has changed. */ |
| bool dlls_changed = false; |
| |
| /* True if the inferior is starting up (inside startup_inferior), |
| and we're nursing it along (through the shell) until it is ready |
| to execute its first instruction. Until that is done, we must |
| not access inferior memory or registers, as we haven't determined |
| the target architecture/description. */ |
| bool starting_up = false; |
| |
| /* Return a reference to the private thread list. */ |
| owning_intrusive_list<thread_info> &thread_list () |
| { return m_thread_list; } |
| |
| /* Return the number of threads in this process. */ |
| unsigned int thread_count () const |
| { return m_ptid_thread_map.size (); } |
| |
| /* Return the thread with ptid PTID, or nullptr if no such thread is |
| found. */ |
| thread_info *find_thread (ptid_t ptid); |
| |
| /* Find the first thread for which FUNC returns true. Return nullptr if no |
| such thread is found. */ |
| thread_info *find_thread (gdb::function_view<bool (thread_info *)> func); |
| |
| /* Invoke FUNC for each thread. */ |
| void for_each_thread (gdb::function_view<void (thread_info *)> func); |
| |
| /* Add a thread with id ID to this process. */ |
| thread_info *add_thread (ptid_t id, void *target_data); |
| |
| /* Remove thread THREAD. |
| |
| THREAD must be part of this process' thread list. */ |
| void remove_thread (thread_info *thread); |
| |
| private: |
| /* This processes' thread list, sorted by creation order. */ |
| owning_intrusive_list<thread_info> m_thread_list; |
| |
| /* A map of ptid_t to thread_info*, for average O(1) ptid_t lookup. |
| Exited threads do not appear in the map. */ |
| gdb::unordered_map<ptid_t, thread_info *> m_ptid_thread_map; |
| }; |
| |
| /* Return a pointer to the current process. Note that the current |
| process may be non-null while the current thread (current_thread) |
| is null. */ |
| |
| struct process_info *current_process (void); |
| |
| extern owning_intrusive_list<process_info> all_processes; |
| |
| /* Invoke FUNC for each process. */ |
| |
| void for_each_process (gdb::function_view<void (process_info *)> func); |
| |
| /* Find the first process for which FUNC returns true. Return NULL if no |
| process satisfying FUNC is found. */ |
| |
| process_info *find_process (gdb::function_view<bool (process_info *)> func); |
| |
| extern thread_info *current_thread; |
| |
| /* Return the first process in the processes list. */ |
| struct process_info *get_first_process (void); |
| |
| struct process_info *add_process (int pid, int attached); |
| void remove_process (struct process_info *process); |
| struct process_info *find_process_pid (int pid); |
| int have_started_inferiors_p (void); |
| int have_attached_inferiors_p (void); |
| |
| /* Switch to a thread of PROC. */ |
| void switch_to_process (process_info *proc); |
| |
| /* Set the inferior current working directory. If CWD is empty, unset |
| the directory. */ |
| void set_inferior_cwd (std::string cwd); |
| |
| #endif /* GDBSERVER_INFERIORS_H */ |