diff options
author | Pedro Alves <palves@redhat.com> | 2020-04-16 14:50:07 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2020-04-16 14:50:07 +0100 |
commit | 381ce63f2f010ef5c246be720ef177cf46a19179 (patch) | |
tree | 34a22623bd10566a7a231891444d06fa711ef71d /gdb/progspace.c | |
parent | a010605fef0eba73c564c3dd22e0a6ecbc26b10e (diff) | |
download | binutils-381ce63f2f010ef5c246be720ef177cf46a19179.zip binutils-381ce63f2f010ef5c246be720ef177cf46a19179.tar.gz binutils-381ce63f2f010ef5c246be720ef177cf46a19179.tar.bz2 |
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.
Diffstat (limited to 'gdb/progspace.c')
-rw-r--r-- | gdb/progspace.c | 84 |
1 files changed, 43 insertions, 41 deletions
diff --git a/gdb/progspace.c b/gdb/progspace.c index 1361040..6419f01 100644 --- a/gdb/progspace.c +++ b/gdb/progspace.c @@ -109,36 +109,65 @@ init_address_spaces (void) -/* Adds a new empty program space to the program space list, and binds - it to ASPACE. Returns the pointer to the new object. */ +/* Add a program space from the program spaces list. */ -program_space::program_space (address_space *aspace_) -: num (++last_program_space_num), aspace (aspace_) +static void +add_program_space (program_space *pspace) { - program_space_alloc_data (this); - if (program_spaces == NULL) - program_spaces = this; + program_spaces = pspace; else { - struct program_space *last; + program_space *last; 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 - libraries, objfiles, and any other references to the PSPACE in - other modules). It is an internal error to call this when PSPACE - is the current program space, since there should always be a - program space. */ +/* Remove a program space from the program spaces list. */ + +static void +remove_program_space (program_space *pspace) +{ + 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 () { gdb_assert (this != current_program_space); + remove_program_space (this); + scoped_restore_current_program_space restore_pspace; set_current_program_space (this); @@ -259,33 +288,6 @@ program_space_empty_p (struct program_space *pspace) 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 REQUESTED is not -1, it's the ID of the pspace that should be printed. Otherwise, all spaces are printed. */ |