Return scoped_fd from open_source_file and find_and_open_source
authorTom Tromey <tom@tromey.com>
Sat, 27 Oct 2018 18:23:44 +0000 (12:23 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 9 Nov 2018 22:47:45 +0000 (15:47 -0700)
This changes open_source_file and find_and_open_source to return
scoped_fd, then updates the callers as appropriate, including using
scoped_fd::to_file.

Tested by the buildbot.

gdb/ChangeLog
2018-11-09  Tom Tromey  <tom@tromey.com>

* common/scoped_fd.h (class scoped_fd): Add move constructor and
move assignment operator.
* psymtab.c (psymtab_to_fullname): Update.
* source.h (open_source_file): Return scoped_fd.
(find_and_open_source): Likewise.
* source.c (open_source_file): Return scoped_fd.
(get_filename_and_charpos): Update.
(print_source_lines_base): Update.  Use scoped_fd::to_file.
(forward_search_command): Likewise.
(reverse_search_command): Likewise.
(find_and_open_source): Return scoped_fd.
* tui/tui-source.c (tui_set_source_content): Update.  Use
gdb_file_up.

gdb/ChangeLog
gdb/common/scoped_fd.h
gdb/psymtab.c
gdb/source.c
gdb/source.h
gdb/tui/tui-source.c

index 4a7936406585e5b46f5d60003e2285584c1e55de..2284038cbcdc3bb2016ef61b7ade7216a92722b2 100644 (file)
@@ -1,3 +1,19 @@
+2018-11-09  Tom Tromey  <tom@tromey.com>
+
+       * common/scoped_fd.h (class scoped_fd): Add move constructor and
+       move assignment operator.
+       * psymtab.c (psymtab_to_fullname): Update.
+       * source.h (open_source_file): Return scoped_fd.
+       (find_and_open_source): Likewise.
+       * source.c (open_source_file): Return scoped_fd.
+       (get_filename_and_charpos): Update.
+       (print_source_lines_base): Update.  Use scoped_fd::to_file.
+       (forward_search_command): Likewise.
+       (reverse_search_command): Likewise.
+       (find_and_open_source): Return scoped_fd.
+       * tui/tui-source.c (tui_set_source_content): Update.  Use
+       gdb_file_up.
+
 2018-11-09  John Baldwin  <jhb@FreeBSD.org>
 
        * minsyms.c (minimal_symbol_reader::install): Fix unsigned
index d20e18a2c09d5e63bfd7846a985d6c6e54f7d768..99fcfacaf9b83bfc735dbc3204544b95dc64220a 100644 (file)
@@ -29,12 +29,31 @@ class scoped_fd
 {
 public:
   explicit scoped_fd (int fd = -1) noexcept : m_fd (fd) {}
+
+  scoped_fd (scoped_fd &&other)
+    : m_fd (other.m_fd)
+  {
+    other.m_fd = -1;
+  }
+
   ~scoped_fd ()
   {
     if (m_fd >= 0)
       close (m_fd);
   }
 
+  scoped_fd &operator= (scoped_fd &&other)
+  {
+    if (m_fd != other.m_fd)
+      {
+       if (m_fd >= 0)
+         close (m_fd);
+       m_fd = other.m_fd;
+       other.m_fd = -1;
+      }
+    return *this;
+  }
+
   DISABLE_COPY_AND_ASSIGN (scoped_fd);
 
   int release () noexcept
index 915e4fb58232e42c8e09bdfabcc0676c8ee8e20d..6d76e8d4898a00e3d607f194c11e24932cc6ebe7 100644 (file)
@@ -1129,12 +1129,11 @@ psymtab_to_fullname (struct partial_symtab *ps)
   if (ps->fullname == NULL)
     {
       gdb::unique_xmalloc_ptr<char> fullname;
-      int fd = find_and_open_source (ps->filename, ps->dirname, &fullname);
+      scoped_fd fd = find_and_open_source (ps->filename, ps->dirname,
+                                          &fullname);
       ps->fullname = fullname.release ();
 
-      if (fd >= 0)
-       close (fd);
-      else
+      if (fd.get () < 0)
        {
          /* rewrite_source_path would be applied by find_and_open_source, we
             should report the pathname where GDB tried to find the file.  */
index 3cdf0b9ec773dea0da8a74d1da719f380c9d28cc..59f00fc38fb43ad0e0d6e100c696830cc28f0b40 100644 (file)
@@ -969,7 +969,9 @@ rewrite_source_path (const char *path)
   return gdb::unique_xmalloc_ptr<char> (new_path);
 }
 
-int
+/* See source.h.  */
+
+scoped_fd
 find_and_open_source (const char *filename,
                      const char *dirname,
                      gdb::unique_xmalloc_ptr<char> *fullname)
@@ -995,7 +997,7 @@ find_and_open_source (const char *filename,
       if (result >= 0)
        {
          *fullname = gdb_realpath (fullname->get ());
-         return result;
+         return scoped_fd (result);
        }
 
       /* Didn't work -- free old one, try again.  */
@@ -1056,7 +1058,7 @@ find_and_open_source (const char *filename,
                        OPEN_MODE, fullname);
     }
 
-  return result;
+  return scoped_fd (result);
 }
 
 /* Open a source file given a symtab S.  Returns a file descriptor or
@@ -1064,15 +1066,16 @@ find_and_open_source (const char *filename,
    
    This function is a convience function to find_and_open_source.  */
 
-int
+scoped_fd
 open_source_file (struct symtab *s)
 {
   if (!s)
-    return -1;
+    return scoped_fd (-1);
 
-  gdb::unique_xmalloc_ptr<char> fullname (s->fullname);
+  gdb::unique_xmalloc_ptr<char> fullname;
   s->fullname = NULL;
-  int fd = find_and_open_source (s->filename, SYMTAB_DIRNAME (s), &fullname);
+  scoped_fd fd = find_and_open_source (s->filename, SYMTAB_DIRNAME (s),
+                                      &fullname);
   s->fullname = fullname.release ();
   return fd;
 }
@@ -1094,11 +1097,9 @@ symtab_to_fullname (struct symtab *s)
      to handle cases like the file being moved.  */
   if (s->fullname == NULL)
     {
-      int fd = open_source_file (s);
+      scoped_fd fd = open_source_file (s);
 
-      if (fd >= 0)
-       close (fd);
-      else
+      if (fd.get () < 0)
        {
          gdb::unique_xmalloc_ptr<char> fullname;
 
@@ -1217,7 +1218,7 @@ get_filename_and_charpos (struct symtab *s, char **fullname)
 {
   int linenums_changed = 0;
 
-  scoped_fd desc (open_source_file (s));
+  scoped_fd desc = open_source_file (s);
   if (desc.get () < 0)
     {
       if (fullname)
@@ -1271,7 +1272,7 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
                         print_source_lines_flags flags)
 {
   int c;
-  int desc;
+  scoped_fd desc;
   int noprint = 0;
   int nlines = stopline - line;
   struct ui_out *uiout = current_uiout;
@@ -1290,24 +1291,26 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
        {
          last_source_visited = s;
          desc = open_source_file (s);
+         if (desc.get () < 0)
+           {
+             last_source_error = desc.get ();
+             noprint = 1;
+           }
        }
       else
        {
-         desc = last_source_error;
          flags |= PRINT_SOURCE_LINES_NOERROR;
+         noprint = 1;
        }
     }
   else
     {
-      desc = last_source_error;
       flags |= PRINT_SOURCE_LINES_NOERROR;
       noprint = 1;
     }
 
-  if (desc < 0 || noprint)
+  if (noprint)
     {
-      last_source_error = desc;
-
       if (!(flags & PRINT_SOURCE_LINES_NOERROR))
        {
          const char *filename = symtab_to_filename_for_display (s);
@@ -1351,22 +1354,16 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
   last_source_error = 0;
 
   if (s->line_charpos == 0)
-    find_source_lines (s, desc);
+    find_source_lines (s, desc.get ());
 
   if (line < 1 || line > s->nlines)
-    {
-      close (desc);
-      error (_("Line number %d out of range; %s has %d lines."),
-            line, symtab_to_filename_for_display (s), s->nlines);
-    }
+    error (_("Line number %d out of range; %s has %d lines."),
+          line, symtab_to_filename_for_display (s), s->nlines);
 
-  if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
-    {
-      close (desc);
-      perror_with_name (symtab_to_filename_for_display (s));
-    }
+  if (lseek (desc.get (), s->line_charpos[line - 1], 0) < 0)
+    perror_with_name (symtab_to_filename_for_display (s));
 
-  gdb_file_up stream (fdopen (desc, FDOPEN_MODE));
+  gdb_file_up stream = desc.to_file (FDOPEN_MODE);
   clearerr (stream.get ());
 
   while (nlines-- > 0)
@@ -1550,7 +1547,7 @@ forward_search_command (const char *regex, int from_tty)
   if (current_source_symtab == 0)
     select_source_symtab (0);
 
-  scoped_fd desc (open_source_file (current_source_symtab));
+  scoped_fd desc = open_source_file (current_source_symtab);
   if (desc.get () < 0)
     perror_with_name (symtab_to_filename_for_display (current_source_symtab));
 
@@ -1564,7 +1561,7 @@ forward_search_command (const char *regex, int from_tty)
       < 0)
     perror_with_name (symtab_to_filename_for_display (current_source_symtab));
 
-  gdb_file_up stream (fdopen (desc.release (), FDOPEN_MODE));
+  gdb_file_up stream = desc.to_file (FDOPEN_MODE);
   clearerr (stream.get ());
   while (1)
     {
@@ -1632,7 +1629,7 @@ reverse_search_command (const char *regex, int from_tty)
   if (current_source_symtab == 0)
     select_source_symtab (0);
 
-  scoped_fd desc (open_source_file (current_source_symtab));
+  scoped_fd desc = open_source_file (current_source_symtab);
   if (desc.get () < 0)
     perror_with_name (symtab_to_filename_for_display (current_source_symtab));
 
@@ -1646,7 +1643,7 @@ reverse_search_command (const char *regex, int from_tty)
       < 0)
     perror_with_name (symtab_to_filename_for_display (current_source_symtab));
 
-  gdb_file_up stream (fdopen (desc.release (), FDOPEN_MODE));
+  gdb_file_up stream = desc.to_file (FDOPEN_MODE);
   clearerr (stream.get ());
   while (line > 1)
     {
index a8769506a0e7082eba096e8cd1fea1ba40cdd43b..9152ec0930f0b65e303ee02b70b31858fe68b547 100644 (file)
@@ -19,6 +19,8 @@
 #ifndef SOURCE_H
 #define SOURCE_H
 
+#include "common/scoped_fd.h"
+
 struct symtab;
 
 /* See openp function definition for their description.  */
@@ -66,13 +68,13 @@ extern void init_source_path (void);
    On Failure
      An invalid file descriptor is returned (the return value is negative).
      FULLNAME is set to NULL.  */
-extern int find_and_open_source (const char *filename,
-                                const char *dirname,
-                                gdb::unique_xmalloc_ptr<char> *fullname);
+extern scoped_fd find_and_open_source (const char *filename,
+                                      const char *dirname,
+                                      gdb::unique_xmalloc_ptr<char> *fullname);
 
 /* Open a source file given a symtab S.  Returns a file descriptor or
    negative number for error.  */
-extern int open_source_file (struct symtab *s);
+extern scoped_fd open_source_file (struct symtab *s);
 
 extern gdb::unique_xmalloc_ptr<char> rewrite_source_path (const char *path);
 
index a26b7b0cbf15e607b0b3ebf1272488512cef5248..3c4f06b01a5cdc169bed65908e6f14a4a9a71662 100644 (file)
@@ -46,8 +46,7 @@ tui_set_source_content (struct symtab *s,
 
   if (s != (struct symtab *) NULL)
     {
-      FILE *stream;
-      int i, desc, c, line_width, nlines;
+      int i, c, line_width, nlines;
       char *src_line = 0;
 
       if ((ret = tui_alloc_source_buffer (TUI_SRC_WIN)) == TUI_SUCCESS)
@@ -56,8 +55,8 @@ tui_set_source_content (struct symtab *s,
          /* Take hilite (window border) into account, when
             calculating the number of lines.  */
          nlines = (line_no + (TUI_SRC_WIN->generic.height - 2)) - line_no;
-         desc = open_source_file (s);
-         if (desc < 0)
+         scoped_fd desc = open_source_file (s);
+         if (desc.get () < 0)
            {
              if (!noerror)
                {
@@ -72,22 +71,17 @@ tui_set_source_content (struct symtab *s,
          else
            {
              if (s->line_charpos == 0)
-               find_source_lines (s, desc);
+               find_source_lines (s, desc.get ());
 
              if (line_no < 1 || line_no > s->nlines)
-               {
-                 close (desc);
-                 printf_unfiltered ("Line number %d out of range; "
-                                    "%s has %d lines.\n",
-                                    line_no,
-                                    symtab_to_filename_for_display (s),
-                                    s->nlines);
-               }
-             else if (lseek (desc, s->line_charpos[line_no - 1], 0) < 0)
-               {
-                 close (desc);
-                 perror_with_name (symtab_to_filename_for_display (s));
-               }
+               printf_unfiltered ("Line number %d out of range; "
+                                  "%s has %d lines.\n",
+                                  line_no,
+                                  symtab_to_filename_for_display (s),
+                                  s->nlines);
+             else if (lseek (desc.get (), s->line_charpos[line_no - 1], 0)
+                      < 0)
+               perror_with_name (symtab_to_filename_for_display (s));
              else
                {
                  int offset, cur_line_no, cur_line, cur_len, threshold;
@@ -108,8 +102,8 @@ tui_set_source_content (struct symtab *s,
                      line and the offset to start the display.  */
                  offset = src->horizontal_offset;
                  threshold = (line_width - 1) + offset;
-                 stream = fdopen (desc, FOPEN_RT);
-                 clearerr (stream);
+                 gdb_file_up stream = desc.to_file (FOPEN_RT);
+                 clearerr (stream.get ());
                  cur_line = 0;
                  src->gdbarch = get_objfile_arch (SYMTAB_OBJFILE (s));
                  src->start_line_or_addr.loa = LOA_LINE;
@@ -123,7 +117,7 @@ tui_set_source_content (struct symtab *s,
                        = TUI_SRC_WIN->generic.content[cur_line];
 
                      /* Get the first character in the line.  */
-                     c = fgetc (stream);
+                     c = fgetc (stream.get ());
 
                      if (offset == 0)
                        src_line = TUI_SRC_WIN->generic.content[cur_line]
@@ -200,21 +194,21 @@ tui_set_source_content (struct symtab *s,
                                { /* If we have not reached EOL, then
                                     eat chars until we do.  */
                                  while (c != EOF && c != '\n' && c != '\r')
-                                   c = fgetc (stream);
+                                   c = fgetc (stream.get ());
                                  /* Handle non-'\n' end-of-line.  */
                                  if (c == '\r' 
-                                     && (c = fgetc (stream)) != '\n' 
+                                     && (c = fgetc (stream.get ())) != '\n'
                                      && c != EOF)
                                    {
-                                      ungetc (c, stream);
-                                      c = '\r';
+                                     ungetc (c, stream.get ());
+                                     c = '\r';
                                    }
                                  
                                }
                            }
                          while (c != EOF && c != '\n' && c != '\r' 
                                 && i < threshold 
-                                && (c = fgetc (stream)));
+                                && (c = fgetc (stream.get ())));
                        }
                      /* Now copy the line taking the offset into
                         account.  */
@@ -232,7 +226,6 @@ tui_set_source_content (struct symtab *s,
                    }
                  if (offset > 0)
                    xfree (src_line);
-                 fclose (stream);
                  TUI_SRC_WIN->generic.content_size = nlines;
                  ret = TUI_SUCCESS;
                }