| /* Inferior process information for the remote server for GDB. | 
 |    Copyright (C) 1993-2025 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 */ |