From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by sourceware.org (Postfix) with ESMTP id 0EECA388702A for ; Tue, 14 Apr 2020 17:54:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 0EECA388702A Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-447-uMp28a57M4GfNGc7Fm6KOA-1; Tue, 14 Apr 2020 13:54:38 -0400 X-MC-Unique: uMp28a57M4GfNGc7Fm6KOA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F0E838017FD for ; Tue, 14 Apr 2020 17:54:37 +0000 (UTC) Received: from cascais.Home (ovpn04.gateway.prod.ext.ams2.redhat.com [10.39.146.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8433C5C1A2 for ; Tue, 14 Apr 2020 17:54:37 +0000 (UTC) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 03/28] Refactor delete_program_space as a destructor Date: Tue, 14 Apr 2020 18:54:09 +0100 Message-Id: <20200414175434.8047-4-palves@redhat.com> In-Reply-To: <20200414175434.8047-1-palves@redhat.com> References: <20200414175434.8047-1-palves@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-28.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Apr 2020 17:54:45 -0000 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. gdb/ChangeLog: yyyy-mm-dd Pedro Alves =09* inferior.c (delete_inferior): Use delete operator directly =09instead of delete_program_space. =09* progspace.c (add_program_space): New, factored out from =09program_space::program_space. =09(remove_program_space): New, factored out from =09delete_program_space. =09(program_space::program_space): Rewrite. =09(program_space::~program_space): Call remove_program_space. =09(delete_program_space): Delete. =09* progspace.h (delete_program_space): Remove. --- gdb/inferior.c | 2 +- gdb/progspace.c | 79 +++++++++++++++++++++++++++++++----------------------= ---- gdb/progspace.h | 4 --- 3 files changed, 44 insertions(+), 41 deletions(-) diff --git a/gdb/inferior.c b/gdb/inferior.c index c2e9da3d3d..ceee00e9ee 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -162,7 +162,7 @@ delete_inferior (struct inferior *todel) =20 /* If this program space is rendered useless, remove it. */ if (program_space_empty_p (inf->pspace)) - delete_program_space (inf->pspace); + delete inf->pspace; =20 delete inf; } diff --git a/gdb/progspace.c b/gdb/progspace.c index 1361040347..55648e4929 100644 --- a/gdb/progspace.c +++ b/gdb/progspace.c @@ -109,26 +109,58 @@ init_address_spaces (void) =20 =0C =20 -/* 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. */ =20 -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 =3D=3D NULL) - program_spaces =3D this; + program_spaces =3D pspace; else { - struct program_space *last; + program_space *last; =20 for (last =3D program_spaces; last->next !=3D NULL; last =3D last->n= ext) =09; - last->next =3D this; + last->next =3D pspace; + } +} + +/* 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 !=3D NULL); + + ss =3D program_spaces; + ss_link =3D &program_spaces; + while (ss !=3D NULL) + { + if (ss =3D=3D pspace) +=09{ +=09 *ss_link =3D ss->next; +=09 return; +=09} + + ss_link =3D &ss->next; + ss =3D *ss_link; } } =20 +/* Adds a new empty program space to the program space list, and binds + it to ASPACE. Returns the pointer to the new object. */ + +program_space::program_space (address_space *aspace_) + : num (++last_program_space_num), + aspace (aspace_) +{ + program_space_alloc_data (this); + + add_program_space (this); +} + /* 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 @@ -139,6 +171,8 @@ program_space::~program_space () { gdb_assert (this !=3D current_program_space); =20 + remove_program_space (this); + scoped_restore_current_program_space restore_pspace; =20 set_current_program_space (this); @@ -259,33 +293,6 @@ program_space_empty_p (struct program_space *pspace) return 1; } =20 -/* 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 spac= e. */ - -void -delete_program_space (struct program_space *pspace) -{ - struct program_space *ss, **ss_link; - gdb_assert (pspace !=3D NULL); - gdb_assert (pspace !=3D current_program_space); - - ss =3D program_spaces; - ss_link =3D &program_spaces; - while (ss !=3D NULL) - { - if (ss =3D=3D pspace) -=09{ -=09 *ss_link =3D ss->next; -=09 break; -=09} - - ss_link =3D &ss->next; - ss =3D *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. */ diff --git a/gdb/progspace.h b/gdb/progspace.h index 71a6f2841e..a0e9e009c0 100644 --- a/gdb/progspace.h +++ b/gdb/progspace.h @@ -362,10 +362,6 @@ extern struct program_space *current_program_space; #define ALL_PSPACES(pspace) \ for ((pspace) =3D program_spaces; (pspace) !=3D NULL; (pspace) =3D (pspa= ce)->next) =20 -/* 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 spac= e. */ -extern void delete_program_space (struct program_space *pspace); - /* Returns the number of program spaces listed. */ extern int number_of_program_spaces (void); =20 --=20 2.14.5