From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26793 invoked by alias); 23 Jul 2012 18:54:02 -0000 Received: (qmail 26778 invoked by uid 22791); 23 Jul 2012 18:54:01 -0000 X-SWARE-Spam-Status: No, hits=-6.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,SPF_HELO_PASS,TW_BJ,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 23 Jul 2012 18:53:48 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q6NIrmCp031442 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 23 Jul 2012 14:53:48 -0400 Received: from barimba (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q6NIrlNG011728 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 23 Jul 2012 14:53:47 -0400 From: Tom Tromey To: Jan Kratochvil Cc: gdb-patches@sourceware.org Subject: Re: [PATCH 01/10] change gdb to refcount bfd everywhere References: <87vchk3lxs.fsf@fleche.redhat.com> <20120719141750.GB23801@host2.jankratochvil.net> <877gtzxyck.fsf@fleche.redhat.com> <87sjcmv16h.fsf@fleche.redhat.com> <20120723085355.GA29593@host2.jankratochvil.net> Date: Mon, 23 Jul 2012 18:54:00 -0000 In-Reply-To: <20120723085355.GA29593@host2.jankratochvil.net> (Jan Kratochvil's message of "Mon, 23 Jul 2012 10:53:55 +0200") Message-ID: <877gtuqpfo.fsf@fleche.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-07/txt/msg00465.txt.bz2 Tom> This changes allocate_objfile to acquire a reference to the BFD, Tom> rather than steal a reference. Then it changes all callers, direct or Tom> indirect, to follow. Jan> map_vmap still steals a reference. Here's what I am checking in for this. I think I have addressed all your comments now. Thanks for the reviews. Tom 2012-07-23 Tom Tromey * rs6000-nat.c (add_vmap): Rewrite archive loop. Fix reference counting. * exec.c (exec_close_1): Unconditionally release vmap's BFD. (map_vmap): Acquire a reference to the BFD. diff --git a/gdb/exec.c b/gdb/exec.c index 9b95e02..e076609 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -127,16 +127,13 @@ exec_close_1 (int quitting) vp = nxt; nxt = vp->nxt; - /* if there is an objfile associated with this bfd, - free_objfile() will do proper cleanup of objfile *and* bfd. */ - if (vp->objfile) { free_objfile (vp->objfile); need_symtab_cleanup = 1; } - else if (vp->bfd != exec_bfd) - gdb_bfd_unref (vp->bfd); + + gdb_bfd_unref (vp->bfd); xfree (vp); } @@ -548,6 +545,7 @@ map_vmap (bfd *abfd, bfd *arch) memset ((char *) vp, '\0', sizeof (*vp)); vp->nxt = 0; vp->bfd = abfd; + gdb_bfd_ref (abfd); vp->name = bfd_get_filename (arch ? arch : abfd); vp->member = arch ? bfd_get_filename (abfd) : ""; diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index 8c3f546..9b8efd3 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -765,12 +765,16 @@ add_vmap (LdInfo *ldi) else if (bfd_check_format (abfd, bfd_archive)) { - last = 0; - /* FIXME??? am I tossing BFDs? bfd? */ - while ((last = gdb_bfd_openr_next_archived_file (abfd, last))) + last = gdb_bfd_openr_next_archived_file (abfd, NULL); + while (last != NULL) { + bfd *next; + if (strcmp (mem, last->filename) == 0) break; + + next = gdb_bfd_openr_next_archived_file (abfd, last); + gdb_bfd_unref (last); } if (!last) @@ -790,6 +794,9 @@ add_vmap (LdInfo *ldi) } vp = map_vmap (last, abfd); + /* map_vmap acquired a reference to LAST, so we can release + ours. */ + gdb_bfd_unref (last); } else { @@ -804,6 +811,11 @@ add_vmap (LdInfo *ldi) /* Always add symbols for the main objfile. */ if (vp == vmap || auto_solib_add) vmap_add_symbols (vp); + + /* Anything needing a reference to ABFD has already acquired it, so + release our local reference. */ + gdb_bfd_unref (abfd); + return vp; }