From 5dc1a7047a77f86de7518a99805af64891d4e22a Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 22 Feb 2018 15:21:42 -0700 Subject: [PATCH] Use scoped_fd in more places This changes a few more places to use scoped_fd. This allows the removal of some cleanups. Regression tested by the buildbot, though note that I'm not sure whether the buildbot actually builds anything using all of these files. gdb/ChangeLog 2018-03-08 Tom Tromey * source.c (get_filename_and_charpos): Use scoped_fd. * nto-procfs.c (procfs_open_1): Use scoped_fd. (procfs_pidlist): Likewise. * procfs.c (proc_get_LDT_entry): Use scoped_fd. (iterate_over_mappings): Likewise. --- gdb/ChangeLog | 8 ++++++++ gdb/nto-procfs.c | 32 +++++++++++++------------------- gdb/procfs.c | 31 +++++++++++-------------------- gdb/source.c | 12 +++++------- 4 files changed, 37 insertions(+), 46 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3d9db8b8d68..adc5d6a9cc4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2018-03-08 Tom Tromey + + * source.c (get_filename_and_charpos): Use scoped_fd. + * nto-procfs.c (procfs_open_1): Use scoped_fd. + (procfs_pidlist): Likewise. + * procfs.c (proc_get_LDT_entry): Use scoped_fd. + (iterate_over_mappings): Likewise. + 2018-03-08 Tom Tromey * infcall.c (struct call_return_meta_info) diff --git a/gdb/nto-procfs.c b/gdb/nto-procfs.c index d72bc1145aa..5ff01560e0b 100644 --- a/gdb/nto-procfs.c +++ b/gdb/nto-procfs.c @@ -43,6 +43,7 @@ #include "solib.h" #include "inf-child.h" #include "common/filestuff.h" +#include "common/scoped_fd.h" #define NULL_PID 0 #define _DEBUG_FLAG_TRACE (_DEBUG_FLAG_TRACE_EXEC|_DEBUG_FLAG_TRACE_RD|\ @@ -113,9 +114,8 @@ procfs_open_1 (struct target_ops *ops, const char *arg, int from_tty) { char *endstr; char buffer[50]; - int fd, total_size; + int total_size; procfs_sysinfo *sysinfo; - struct cleanup *cleanups; char nto_procfs_path[PATH_MAX]; /* Offer to kill previous inferiors before opening this target. */ @@ -158,17 +158,16 @@ procfs_open_1 (struct target_ops *ops, const char *arg, int from_tty) snprintf (nto_procfs_path, PATH_MAX - 1, "%s%s", (nodestr != NULL) ? nodestr : "", "/proc"); - fd = open (nto_procfs_path, O_RDONLY); - if (fd == -1) + scoped_fd fd (open (nto_procfs_path, O_RDONLY)); + if (fd.get () == -1) { printf_filtered ("Error opening %s : %d (%s)\n", nto_procfs_path, errno, safe_strerror (errno)); error (_("Invalid procfs arg")); } - cleanups = make_cleanup_close (fd); sysinfo = (void *) buffer; - if (devctl (fd, DCMD_PROC_SYSINFO, sysinfo, sizeof buffer, 0) != EOK) + if (devctl (fd.get (), DCMD_PROC_SYSINFO, sysinfo, sizeof buffer, 0) != EOK) { printf_filtered ("Error getting size: %d (%s)\n", errno, safe_strerror (errno)); @@ -186,7 +185,8 @@ procfs_open_1 (struct target_ops *ops, const char *arg, int from_tty) } else { - if (devctl (fd, DCMD_PROC_SYSINFO, sysinfo, total_size, 0) != EOK) + if (devctl (fd.get (), DCMD_PROC_SYSINFO, sysinfo, total_size, 0) + != EOK) { printf_filtered ("Error getting sysinfo: %d (%s)\n", errno, safe_strerror (errno)); @@ -201,7 +201,6 @@ procfs_open_1 (struct target_ops *ops, const char *arg, int from_tty) } } } - do_cleanups (cleanups); inf_child_open_target (ops, arg, from_tty); printf_filtered ("Debugging using %s\n", nto_procfs_path); @@ -377,9 +376,6 @@ procfs_pidlist (const char *args, int from_tty) do { - int fd; - struct cleanup *inner_cleanup; - /* Get the right pid and procfs path for the pid. */ do { @@ -397,17 +393,16 @@ procfs_pidlist (const char *args, int from_tty) while (pid == 0); /* Open the procfs path. */ - fd = open (buf, O_RDONLY); - if (fd == -1) + scoped_fd fd (open (buf, O_RDONLY)); + if (fd.get () == -1) { fprintf_unfiltered (gdb_stderr, "failed to open %s - %d (%s)\n", buf, errno, safe_strerror (errno)); continue; } - inner_cleanup = make_cleanup_close (fd); pidinfo = (procfs_info *) buf; - if (devctl (fd, DCMD_PROC_INFO, pidinfo, sizeof (buf), 0) != EOK) + if (devctl (fd.get (), DCMD_PROC_INFO, pidinfo, sizeof (buf), 0) != EOK) { fprintf_unfiltered (gdb_stderr, "devctl DCMD_PROC_INFO failed - %d (%s)\n", @@ -417,7 +412,8 @@ procfs_pidlist (const char *args, int from_tty) num_threads = pidinfo->num_threads; info = (procfs_debuginfo *) buf; - if (devctl (fd, DCMD_PROC_MAPDEBUG_BASE, info, sizeof (buf), 0) != EOK) + if (devctl (fd.get (), DCMD_PROC_MAPDEBUG_BASE, info, sizeof (buf), 0) + != EOK) strcpy (name, "unavailable"); else strcpy (name, info->path); @@ -427,7 +423,7 @@ procfs_pidlist (const char *args, int from_tty) for (status->tid = 1; status->tid <= num_threads; status->tid++) { const int err - = devctl (fd, DCMD_PROC_TIDSTATUS, status, sizeof (buf), 0); + = devctl (fd.get (), DCMD_PROC_TIDSTATUS, status, sizeof (buf), 0); printf_filtered ("%s - %d", name, pid); if (err == EOK && status->tid != 0) printf_filtered ("/%d\n", status->tid); @@ -437,8 +433,6 @@ procfs_pidlist (const char *args, int from_tty) break; } } - - do_cleanups (inner_cleanup); } while (dirp != NULL); diff --git a/gdb/procfs.c b/gdb/procfs.c index 374faa92e2b..cd6dcaad572 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -46,6 +46,7 @@ #include "auxv.h" #include "procfs.h" #include "observer.h" +#include "common/scoped_fd.h" /* This module provides the interface between GDB and the /proc file system, which is used on many versions of Unix @@ -1593,8 +1594,6 @@ proc_get_LDT_entry (procinfo *pi, int key) { static struct ssd *ldt_entry = NULL; char pathname[MAX_PROC_NAME_SIZE]; - struct cleanup *old_chain = NULL; - int fd; /* Allocate space for one LDT entry. This alloc must persist, because we return a pointer to it. */ @@ -1603,16 +1602,16 @@ proc_get_LDT_entry (procinfo *pi, int key) /* Open the file descriptor for the LDT table. */ sprintf (pathname, "/proc/%d/ldt", pi->pid); - if ((fd = open_with_retry (pathname, O_RDONLY)) < 0) + scoped_fd fd (open_with_retry (pathname, O_RDONLY)); + if (fd.get () < 0) { proc_warn (pi, "proc_get_LDT_entry (open)", __LINE__); return NULL; } - /* Make sure it gets closed again! */ - old_chain = make_cleanup_close (fd); /* Now 'read' thru the table, find a match and return it. */ - while (read (fd, ldt_entry, sizeof (struct ssd)) == sizeof (struct ssd)) + while (read (fd.get (), ldt_entry, sizeof (struct ssd)) + == sizeof (struct ssd)) { if (ldt_entry->sel == 0 && ldt_entry->bo == 0 && @@ -1627,7 +1626,6 @@ proc_get_LDT_entry (procinfo *pi, int key) } } /* Loop ended, match not found. */ - do_cleanups (old_chain); return NULL; } @@ -3426,40 +3424,33 @@ iterate_over_mappings (procinfo *pi, find_memory_region_ftype child_func, struct prmap *prmaps; struct prmap *prmap; int funcstat; - int map_fd; int nmap; - struct cleanup *cleanups = make_cleanup (null_cleanup, NULL); struct stat sbuf; /* Get the number of mappings, allocate space, and read the mappings into prmaps. */ /* Open map fd. */ sprintf (pathname, "/proc/%d/map", pi->pid); - if ((map_fd = open (pathname, O_RDONLY)) < 0) - proc_error (pi, "iterate_over_mappings (open)", __LINE__); - /* Make sure it gets closed again. */ - make_cleanup_close (map_fd); + scoped_fd map_fd (open (pathname, O_RDONLY)); + if (map_fd.get () < 0) + proc_error (pi, "iterate_over_mappings (open)", __LINE__); /* Use stat to determine the file size, and compute the number of prmap_t objects it contains. */ - if (fstat (map_fd, &sbuf) != 0) + if (fstat (map_fd.get (), &sbuf) != 0) proc_error (pi, "iterate_over_mappings (fstat)", __LINE__); nmap = sbuf.st_size / sizeof (prmap_t); prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps)); - if (read (map_fd, (char *) prmaps, nmap * sizeof (*prmaps)) + if (read (map_fd.get (), (char *) prmaps, nmap * sizeof (*prmaps)) != (nmap * sizeof (*prmaps))) proc_error (pi, "iterate_over_mappings (read)", __LINE__); for (prmap = prmaps; nmap > 0; prmap++, nmap--) if ((funcstat = (*func) (prmap, child_func, data)) != 0) - { - do_cleanups (cleanups); - return funcstat; - } + return funcstat; - do_cleanups (cleanups); return 0; } diff --git a/gdb/source.c b/gdb/source.c index 3b4920fe8a4..5e50f425f3b 100644 --- a/gdb/source.c +++ b/gdb/source.c @@ -42,6 +42,7 @@ #include "ui-out.h" #include "readline/readline.h" #include "common/enum-flags.h" +#include "common/scoped_fd.h" #include #include "common/pathstuff.h" @@ -1215,24 +1216,21 @@ find_source_lines (struct symtab *s, int desc) static int get_filename_and_charpos (struct symtab *s, char **fullname) { - int desc, linenums_changed = 0; - struct cleanup *cleanups; + int linenums_changed = 0; - desc = open_source_file (s); - if (desc < 0) + scoped_fd desc (open_source_file (s)); + if (desc.get () < 0) { if (fullname) *fullname = NULL; return 0; } - cleanups = make_cleanup_close (desc); if (fullname) *fullname = s->fullname; if (s->line_charpos == 0) linenums_changed = 1; if (linenums_changed) - find_source_lines (s, desc); - do_cleanups (cleanups); + find_source_lines (s, desc.get ()); return linenums_changed; } -- 2.30.2