Refactor delete_program_space as a destructor
Currently, while the program_space's ctor adds the new pspace to the pspaces list, the destructor doesn't remove the pspace from the pspace list. Instead, you're supposed to use delete_program_space, to both remove the pspace from the list, and deleting the pspace. This patch eliminates delete_program_space, and makes the pspace dtor remove the deleted pspace from the pspace list itself, i.e., makes the dtor do the mirror opposite of the ctor. I found this helps with a following patch that will allocate a mock program_space on the stack. It's easier to just let the regular dtor remove the mock pspace from the pspace list than arrange to call delete_program_space instead of the pspace dtor in that situation. While at it, move the ctor/dtor intro comments to the header file, and make the ctor explicit. gdb/ChangeLog: 2020-04-16 Pedro Alves <palves@redhat.com> * inferior.c (delete_inferior): Use delete operator directly instead of delete_program_space. * progspace.c (add_program_space): New, factored out from program_space::program_space. (remove_program_space): New, factored out from delete_program_space. (program_space::program_space): Remove intro comment. Rewrite. (program_space::~program_space): Remove intro comment. Call remove_program_space. (delete_program_space): Delete. * progspace.h (program_space::program_space): Make explicit. Move intro comment here, adjusted. (program_space::~program_space): Move intro comment here, adjusted. (delete_program_space): Remove.
This commit is contained in:
parent
a010605fef
commit
381ce63f2f
4 changed files with 71 additions and 47 deletions
|
@ -1,3 +1,21 @@
|
||||||
|
2020-04-16 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
* inferior.c (delete_inferior): Use delete operator directly
|
||||||
|
instead of delete_program_space.
|
||||||
|
* progspace.c (add_program_space): New, factored out from
|
||||||
|
program_space::program_space.
|
||||||
|
(remove_program_space): New, factored out from
|
||||||
|
delete_program_space.
|
||||||
|
(program_space::program_space): Remove intro comment. Rewrite.
|
||||||
|
(program_space::~program_space): Remove intro comment. Call
|
||||||
|
remove_program_space.
|
||||||
|
(delete_program_space): Delete.
|
||||||
|
* progspace.h (program_space::program_space): Make explicit. Move
|
||||||
|
intro comment here, adjusted.
|
||||||
|
(program_space::~program_space): Move intro comment here,
|
||||||
|
adjusted.
|
||||||
|
(delete_program_space): Remove.
|
||||||
|
|
||||||
2020-04-16 Tom Tromey <tromey@adacore.com>
|
2020-04-16 Tom Tromey <tromey@adacore.com>
|
||||||
|
|
||||||
* windows-nat.c (windows_nat::handle_access_violation): New
|
* windows-nat.c (windows_nat::handle_access_violation): New
|
||||||
|
|
|
@ -162,7 +162,7 @@ delete_inferior (struct inferior *todel)
|
||||||
|
|
||||||
/* If this program space is rendered useless, remove it. */
|
/* If this program space is rendered useless, remove it. */
|
||||||
if (program_space_empty_p (inf->pspace))
|
if (program_space_empty_p (inf->pspace))
|
||||||
delete_program_space (inf->pspace);
|
delete inf->pspace;
|
||||||
|
|
||||||
delete inf;
|
delete inf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,36 +109,65 @@ init_address_spaces (void)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Adds a new empty program space to the program space list, and binds
|
/* Add a program space from the program spaces list. */
|
||||||
it to ASPACE. Returns the pointer to the new object. */
|
|
||||||
|
|
||||||
program_space::program_space (address_space *aspace_)
|
static void
|
||||||
: num (++last_program_space_num), aspace (aspace_)
|
add_program_space (program_space *pspace)
|
||||||
{
|
{
|
||||||
program_space_alloc_data (this);
|
|
||||||
|
|
||||||
if (program_spaces == NULL)
|
if (program_spaces == NULL)
|
||||||
program_spaces = this;
|
program_spaces = pspace;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct program_space *last;
|
program_space *last;
|
||||||
|
|
||||||
for (last = program_spaces; last->next != NULL; last = last->next)
|
for (last = program_spaces; last->next != NULL; last = last->next)
|
||||||
;
|
;
|
||||||
last->next = this;
|
last->next = pspace;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Releases program space PSPACE, and all its contents (shared
|
/* Remove a program space from the program spaces list. */
|
||||||
libraries, objfiles, and any other references to the PSPACE in
|
|
||||||
other modules). It is an internal error to call this when PSPACE
|
static void
|
||||||
is the current program space, since there should always be a
|
remove_program_space (program_space *pspace)
|
||||||
program space. */
|
{
|
||||||
|
program_space *ss, **ss_link;
|
||||||
|
gdb_assert (pspace != NULL);
|
||||||
|
|
||||||
|
ss = program_spaces;
|
||||||
|
ss_link = &program_spaces;
|
||||||
|
while (ss != NULL)
|
||||||
|
{
|
||||||
|
if (ss == pspace)
|
||||||
|
{
|
||||||
|
*ss_link = ss->next;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ss_link = &ss->next;
|
||||||
|
ss = *ss_link;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See progspace.h. */
|
||||||
|
|
||||||
|
program_space::program_space (address_space *aspace_)
|
||||||
|
: num (++last_program_space_num),
|
||||||
|
aspace (aspace_)
|
||||||
|
{
|
||||||
|
program_space_alloc_data (this);
|
||||||
|
|
||||||
|
add_program_space (this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See progspace.h. */
|
||||||
|
|
||||||
program_space::~program_space ()
|
program_space::~program_space ()
|
||||||
{
|
{
|
||||||
gdb_assert (this != current_program_space);
|
gdb_assert (this != current_program_space);
|
||||||
|
|
||||||
|
remove_program_space (this);
|
||||||
|
|
||||||
scoped_restore_current_program_space restore_pspace;
|
scoped_restore_current_program_space restore_pspace;
|
||||||
|
|
||||||
set_current_program_space (this);
|
set_current_program_space (this);
|
||||||
|
@ -259,33 +288,6 @@ program_space_empty_p (struct program_space *pspace)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove a program space from the program spaces list and release it. It is
|
|
||||||
an error to call this function while PSPACE is the current program space. */
|
|
||||||
|
|
||||||
void
|
|
||||||
delete_program_space (struct program_space *pspace)
|
|
||||||
{
|
|
||||||
struct program_space *ss, **ss_link;
|
|
||||||
gdb_assert (pspace != NULL);
|
|
||||||
gdb_assert (pspace != current_program_space);
|
|
||||||
|
|
||||||
ss = program_spaces;
|
|
||||||
ss_link = &program_spaces;
|
|
||||||
while (ss != NULL)
|
|
||||||
{
|
|
||||||
if (ss == pspace)
|
|
||||||
{
|
|
||||||
*ss_link = ss->next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ss_link = &ss->next;
|
|
||||||
ss = *ss_link;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete pspace;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prints the list of program spaces and their details on UIOUT. If
|
/* Prints the list of program spaces and their details on UIOUT. If
|
||||||
REQUESTED is not -1, it's the ID of the pspace that should be
|
REQUESTED is not -1, it's the ID of the pspace that should be
|
||||||
printed. Otherwise, all spaces are printed. */
|
printed. Otherwise, all spaces are printed. */
|
||||||
|
|
|
@ -209,7 +209,15 @@ private:
|
||||||
|
|
||||||
struct program_space
|
struct program_space
|
||||||
{
|
{
|
||||||
program_space (address_space *aspace_);
|
/* Constructs a new empty program space, binds it to ASPACE, and
|
||||||
|
adds it to the program space list. */
|
||||||
|
explicit program_space (address_space *aspace);
|
||||||
|
|
||||||
|
/* Releases a program space, and all its contents (shared libraries,
|
||||||
|
objfiles, and any other references to the program space in other
|
||||||
|
modules). It is an internal error to call this when the program
|
||||||
|
space is the current program space, since there should always be
|
||||||
|
a program space. */
|
||||||
~program_space ();
|
~program_space ();
|
||||||
|
|
||||||
typedef unwrapping_objfile_range objfiles_range;
|
typedef unwrapping_objfile_range objfiles_range;
|
||||||
|
@ -362,10 +370,6 @@ extern struct program_space *current_program_space;
|
||||||
#define ALL_PSPACES(pspace) \
|
#define ALL_PSPACES(pspace) \
|
||||||
for ((pspace) = program_spaces; (pspace) != NULL; (pspace) = (pspace)->next)
|
for ((pspace) = program_spaces; (pspace) != NULL; (pspace) = (pspace)->next)
|
||||||
|
|
||||||
/* Remove a program space from the program spaces list and release it. It is
|
|
||||||
an error to call this function while PSPACE is the current program space. */
|
|
||||||
extern void delete_program_space (struct program_space *pspace);
|
|
||||||
|
|
||||||
/* Returns the number of program spaces listed. */
|
/* Returns the number of program spaces listed. */
|
||||||
extern int number_of_program_spaces (void);
|
extern int number_of_program_spaces (void);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue