+ return process;
+}
+
+/* Remove a process from the common process list and free the memory
+ allocated for it.
+ The caller is responsible for freeing private data first. */
+
+void
+remove_process (struct process_info *process)
+{
+ clear_symbol_cache (&process->symbol_cache);
+ free_all_breakpoints (process);
+ gdb_assert (find_thread_process (process) == NULL);
+ all_processes.remove (process);
+ delete process;
+}
+
+process_info *
+find_process_pid (int pid)
+{
+ return find_process ([&] (process_info *process) {
+ return process->pid == pid;
+ });
+}
+
+/* Get the first process in the process list, or NULL if the list is empty. */
+
+process_info *
+get_first_process (void)
+{
+ if (!all_processes.empty ())
+ return all_processes.front ();
+ else
+ return NULL;
+}
+
+/* Return non-zero if there are any inferiors that we have created
+ (as opposed to attached-to). */
+
+int
+have_started_inferiors_p (void)
+{
+ return find_process ([] (process_info *process) {
+ return !process->attached;
+ }) != NULL;
+}
+
+/* Return non-zero if there are any inferiors that we have attached to. */
+
+int
+have_attached_inferiors_p (void)
+{
+ return find_process ([] (process_info *process) {
+ return process->attached;
+ }) != NULL;
+}
+
+struct process_info *
+get_thread_process (const struct thread_info *thread)
+{
+ return find_process_pid (thread->id.pid ());
+}
+
+struct process_info *
+current_process (void)
+{
+ gdb_assert (current_thread != NULL);
+ return get_thread_process (current_thread);
+}
+
+/* See gdbsupport/common-gdbthread.h. */
+
+void
+switch_to_thread (ptid_t ptid)
+{
+ gdb_assert (ptid != minus_one_ptid);
+ current_thread = find_thread_ptid (ptid);
+}
+
+/* See gdbsupport/common-inferior.h. */
+
+const char *
+get_inferior_cwd ()
+{
+ return current_inferior_cwd;
+}
+
+/* See gdbsupport/common-inferior.h. */
+
+void
+set_inferior_cwd (const char *cwd)
+{
+ xfree ((void *) current_inferior_cwd);
+ if (cwd != NULL)
+ current_inferior_cwd = xstrdup (cwd);
+ else
+ current_inferior_cwd = NULL;