aboutsummaryrefslogtreecommitdiff
path: root/gdb/objfiles.c
diff options
context:
space:
mode:
authorPaul Pluzhnikov <ppluzhnikov@google.com>2009-08-21 17:57:17 +0000
committerPaul Pluzhnikov <ppluzhnikov@google.com>2009-08-21 17:57:17 +0000
commit3db741efb7056cc5720fce6303962042d2da3ec9 (patch)
treee6bb583aaa7842e4305528e3a8d1571e4e48f84e /gdb/objfiles.c
parent032b94c5fd9c2734a401798341eece75159ad0fb (diff)
downloadgdb-3db741efb7056cc5720fce6303962042d2da3ec9.zip
gdb-3db741efb7056cc5720fce6303962042d2da3ec9.tar.gz
gdb-3db741efb7056cc5720fce6303962042d2da3ec9.tar.bz2
2009-08-21 Paul Pluzhnikov <ppluzhnikov@google.com>
* objfiles.h (gdb_bfd_ref): New prototype. * objfiles.c (gdb_bfd_ref): New function. (allocate_objfile): Call it. (gdb_bfd_unref): Adjust assertion. * solib.c (solib_map_sections): Add reference. (symbol_add_stub): Don't add reference here. * symfile.c (reread_symbols): Add reference.
Diffstat (limited to 'gdb/objfiles.c')
-rw-r--r--gdb/objfiles.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 92db65e..109a66e 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -181,7 +181,7 @@ allocate_objfile (bfd *abfd, int flags)
that any data that is reference is saved in the per-objfile data
region. */
- objfile->obfd = abfd;
+ objfile->obfd = gdb_bfd_ref (abfd);
if (objfile->name != NULL)
{
xfree (objfile->name);
@@ -1062,7 +1062,26 @@ objfiles_changed (void)
objfiles_changed_p = 1; /* Rebuild section map next time we need it. */
}
-/* Unreference and possibly close abfd. */
+/* Add reference to ABFD. Returns ABFD. */
+struct bfd *
+gdb_bfd_ref (struct bfd *abfd)
+{
+ int *p_refcount = bfd_usrdata (abfd);
+
+ if (p_refcount != NULL)
+ {
+ *p_refcount += 1;
+ return abfd;
+ }
+
+ p_refcount = xmalloc (sizeof (*p_refcount));
+ *p_refcount = 1;
+ bfd_usrdata (abfd) = p_refcount;
+
+ return abfd;
+}
+
+/* Unreference and possibly close ABFD. */
void
gdb_bfd_unref (struct bfd *abfd)
{
@@ -1074,16 +1093,14 @@ gdb_bfd_unref (struct bfd *abfd)
p_refcount = bfd_usrdata (abfd);
- /* Valid range for p_refcount: NULL (single owner), or a pointer
- to int counter, which has a value of 1 (single owner) or 2 (shared). */
- gdb_assert (p_refcount == NULL || *p_refcount == 1 || *p_refcount == 2);
+ /* Valid range for p_refcount: a pointer to int counter, which has a
+ value of 1 (single owner) or 2 (shared). */
+ gdb_assert (*p_refcount == 1 || *p_refcount == 2);
+
+ *p_refcount -= 1;
+ if (*p_refcount > 0)
+ return;
- if (p_refcount != NULL)
- {
- *p_refcount -= 1;
- if (*p_refcount > 0)
- return;
- }
xfree (p_refcount);
bfd_usrdata (abfd) = NULL; /* Paranoia. */