gdb/continuations: turn continuation functions into inferior methods

Turn continuations-related functions into methods of the inferior
class.  This is a refactoring.

gdb/ChangeLog:
2021-04-22  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* Makefile.in (COMMON_SFILES): Remove continuations.c.
	* inferior.c (inferior::add_continuation): New method, adapted
	from 'add_inferior_continuation'.
	(inferior::do_all_continuations): New method, adapted from
	'do_all_inferior_continuations'.
	(inferior::~inferior): Clear the list of continuations directly.
	* inferior.h (class inferior) <continuations>: Rename into...
	<m_continuations>: ...this and make private.
	* continuations.c: Remove.
	* continuations.h: Remove.
	* event-top.c: Don't include "continuations.h".

	Update the users below.
	* inf-loop.c (inferior_event_handler)
	* infcmd.c (attach_command)
	(notice_new_inferior): Update.
This commit is contained in:
Tankut Baris Aktemur 2021-04-22 17:22:39 +02:00
parent c4c493de2b
commit 4efeb0d3e8
9 changed files with 51 additions and 108 deletions

View file

@ -1,3 +1,22 @@
2021-04-22 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* Makefile.in (COMMON_SFILES): Remove continuations.c.
* inferior.c (inferior::add_continuation): New method, adapted
from 'add_inferior_continuation'.
(inferior::do_all_continuations): New method, adapted from
'do_all_inferior_continuations'.
(inferior::~inferior): Clear the list of continuations directly.
* inferior.h (class inferior) <continuations>: Rename into...
<m_continuations>: ...this and make private.
* continuations.c: Remove.
* continuations.h: Remove.
* event-top.c: Don't include "continuations.h".
Update the users below.
* inf-loop.c (inferior_event_handler)
* infcmd.c (attach_command)
(notice_new_inferior): Update.
2021-04-22 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> 2021-04-22 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* inferior.h (class inferior) <continuations>: Change the type * inferior.h (class inferior) <continuations>: Change the type

View file

@ -1004,7 +1004,6 @@ COMMON_SFILES = \
coffread.c \ coffread.c \
complaints.c \ complaints.c \
completer.c \ completer.c \
continuations.c \
copying.c \ copying.c \
corefile.c \ corefile.c \
corelow.c \ corelow.c \

View file

@ -1,56 +0,0 @@
/* Continuations for GDB, the GNU debugger.
Copyright (C) 1986-2021 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/>. */
#include "defs.h"
#include "gdbthread.h"
#include "inferior.h"
#include "continuations.h"
/* Add a continuation to the continuation list of INFERIOR. The new
continuation will be added at the front. */
void
add_inferior_continuation (std::function<void ()> &&cont)
{
struct inferior *inf = current_inferior ();
inf->continuations.emplace_front (std::move (cont));
}
/* Do all continuations of the current inferior. */
void
do_all_inferior_continuations ()
{
struct inferior *inf = current_inferior ();
while (!inf->continuations.empty ())
{
auto iter = inf->continuations.begin ();
(*iter) ();
inf->continuations.erase (iter);
}
}
/* Get rid of all the inferior-wide continuations of INF. */
void
discard_all_inferior_continuations (struct inferior *inf)
{
inf->continuations.clear ();
}

View file

@ -1,39 +0,0 @@
/* Continuations for GDB, the GNU debugger.
Copyright (C) 1999-2021 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 CONTINUATIONS_H
#define CONTINUATIONS_H
#include <functional>
struct inferior;
/* To continue the execution commands when running gdb asynchronously.
A continuation is an std::function to be called to finish the
command, once the target has stopped. Such mechanism is used by
the attach command and the remote target when a new inferior is
detected. */
/* Inferior specific (any thread) continuations. */
extern void add_inferior_continuation (std::function<void ()> &&cont);
extern void do_all_inferior_continuations ();
extern void discard_all_inferior_continuations (struct inferior *inf);
#endif

View file

@ -33,7 +33,6 @@
#include "main.h" #include "main.h"
#include "gdbthread.h" #include "gdbthread.h"
#include "observable.h" #include "observable.h"
#include "continuations.h"
#include "gdbcmd.h" /* for dont_repeat() */ #include "gdbcmd.h" /* for dont_repeat() */
#include "annotate.h" #include "annotate.h"
#include "maint.h" #include "maint.h"

View file

@ -26,7 +26,6 @@
#include "remote.h" #include "remote.h"
#include "language.h" #include "language.h"
#include "gdbthread.h" #include "gdbthread.h"
#include "continuations.h"
#include "interps.h" #include "interps.h"
#include "top.h" #include "top.h"
#include "observable.h" #include "observable.h"
@ -55,7 +54,7 @@ inferior_event_handler (enum inferior_event_type event_type)
/* Do all continuations associated with the whole inferior (not /* Do all continuations associated with the whole inferior (not
a particular thread). */ a particular thread). */
if (inferior_ptid != null_ptid) if (inferior_ptid != null_ptid)
do_all_inferior_continuations (); current_inferior ()->do_all_continuations ();
/* When running a command list (from a user command, say), these /* When running a command list (from a user command, say), these
are only run when the command list is all done. */ are only run when the command list is all done. */

View file

@ -47,7 +47,6 @@
#include "inline-frame.h" #include "inline-frame.h"
#include "tracepoint.h" #include "tracepoint.h"
#include "inf-loop.h" #include "inf-loop.h"
#include "continuations.h"
#include "linespec.h" #include "linespec.h"
#include "thread-fsm.h" #include "thread-fsm.h"
#include "top.h" #include "top.h"
@ -2645,7 +2644,7 @@ attach_command (const char *args, int from_tty)
inferior->control.stop_soon = STOP_QUIETLY_NO_SIGSTOP; inferior->control.stop_soon = STOP_QUIETLY_NO_SIGSTOP;
/* Wait for stop. */ /* Wait for stop. */
add_inferior_continuation ([=] () inferior->add_continuation ([=] ()
{ {
attach_post_wait (from_tty, mode); attach_post_wait (from_tty, mode);
}); });
@ -2702,7 +2701,7 @@ notice_new_inferior (thread_info *thr, int leave_running, int from_tty)
inferior->control.stop_soon = STOP_QUIETLY_REMOTE; inferior->control.stop_soon = STOP_QUIETLY_REMOTE;
/* Wait for stop before proceeding. */ /* Wait for stop before proceeding. */
add_inferior_continuation ([=] () inferior->add_continuation ([=] ()
{ {
attach_post_wait (from_tty, mode); attach_post_wait (from_tty, mode);
}); });

View file

@ -31,7 +31,6 @@
#include "symfile.h" #include "symfile.h"
#include "gdbsupport/environ.h" #include "gdbsupport/environ.h"
#include "cli/cli-utils.h" #include "cli/cli-utils.h"
#include "continuations.h"
#include "arch-utils.h" #include "arch-utils.h"
#include "target-descriptions.h" #include "target-descriptions.h"
#include "readline/tilde.h" #include "readline/tilde.h"
@ -74,7 +73,7 @@ inferior::~inferior ()
{ {
inferior *inf = this; inferior *inf = this;
discard_all_inferior_continuations (inf); m_continuations.clear ();
inferior_free_data (inf); inferior_free_data (inf);
xfree (inf->args); xfree (inf->args);
target_desc_info_free (inf->tdesc_info); target_desc_info_free (inf->tdesc_info);
@ -106,6 +105,23 @@ inferior::tty ()
return m_terminal.get (); return m_terminal.get ();
} }
void
inferior::add_continuation (std::function<void ()> &&cont)
{
m_continuations.emplace_front (std::move (cont));
}
void
inferior::do_all_continuations ()
{
while (!m_continuations.empty ())
{
auto iter = m_continuations.begin ();
(*iter) ();
m_continuations.erase (iter);
}
}
struct inferior * struct inferior *
add_inferior_silent (int pid) add_inferior_silent (int pid)
{ {

View file

@ -422,6 +422,14 @@ public:
inline safe_inf_threads_range threads_safe () inline safe_inf_threads_range threads_safe ()
{ return safe_inf_threads_range (this->thread_list); } { return safe_inf_threads_range (this->thread_list); }
/* Continuations-related methods. A continuation is an std::function
to be called to finish the execution of a command when running
GDB asynchronously. A continuation is executed after any thread
of this inferior stops. Continuations are used by the attach
command and the remote target when a new inferior is detected. */
void add_continuation (std::function<void ()> &&cont);
void do_all_continuations ();
/* Set/get file name for default use for standard in/out in the /* Set/get file name for default use for standard in/out in the
inferior. On Unix systems, we try to make TERMINAL_NAME the inferior. On Unix systems, we try to make TERMINAL_NAME the
inferior's controlling terminal. If TERMINAL_NAME is nullptr or inferior's controlling terminal. If TERMINAL_NAME is nullptr or
@ -508,10 +516,6 @@ public:
/* True if we're in the process of detaching from this inferior. */ /* True if we're in the process of detaching from this inferior. */
bool detaching = false; bool detaching = false;
/* What is left to do for an execution command after any thread of
this inferior stops. */
std::list<std::function<void ()>> continuations;
/* True if setup_inferior wasn't called for this inferior yet. /* True if setup_inferior wasn't called for this inferior yet.
Until that is done, we must not access inferior memory or Until that is done, we must not access inferior memory or
registers, as we haven't determined the target registers, as we haven't determined the target
@ -559,6 +563,9 @@ private:
/* The name of terminal device to use for I/O. */ /* The name of terminal device to use for I/O. */
gdb::unique_xmalloc_ptr<char> m_terminal; gdb::unique_xmalloc_ptr<char> m_terminal;
/* The list of continuations. */
std::list<std::function<void ()>> m_continuations;
}; };
/* Keep a registry of per-inferior data-pointers required by other GDB /* Keep a registry of per-inferior data-pointers required by other GDB