.gdb_index writer: close the file before unlinking it
authorPedro Alves <palves@redhat.com>
Mon, 19 Jun 2017 11:46:47 +0000 (12:46 +0100)
committerPedro Alves <palves@redhat.com>
Mon, 19 Jun 2017 11:46:47 +0000 (12:46 +0100)
We should close the file before unlinking because on MS-Windows one
cannot delete a file that is still open.

I considered making 'gdb::unlinker::unlinker(const char *)'
'noexcept(true)' and then adding
  static_assert (noexcept (gdb::unlinker (filename.c_str ())), "");

but that doesn't really work because gdb::unlinker has a gdb_assert,
which can throw a QUIT if/when the assertion fails.  'noexcept(true)'
would cause GDB to abruptly terminate if/when the assertion fails.

gdb/ChangeLog:
2017-06-19  Pedro Alves  <palves@redhat.com>

* dwarf2read.c (write_psymtabs_to_index): Construct file_closer
after gdb::unlinker.

gdb/ChangeLog
gdb/dwarf2read.c

index aaf4b89..c7cf410 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-19  Pedro Alves  <palves@redhat.com>
+
+       * dwarf2read.c (write_psymtabs_to_index): Construct file_closer
+       after gdb::unlinker.
+
 2017-06-19  Sergio Durigan Junior  <sergiodj@redhat.com>
 
        * mi/mi-cm-env.c (_initialize_mi_cmd_env): Use getenv instead of
index abe14b2..2369d4b 100644 (file)
@@ -23776,8 +23776,12 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir)
   if (!out_file)
     error (_("Can't open `%s' for writing"), filename.c_str ());
 
-  file_closer close_out_file (out_file);
+  /* Order matters here; we want FILE to be closed before FILENAME is
+     unlinked, because on MS-Windows one cannot delete a file that is
+     still open.  (Don't call anything here that might throw until
+     file_closer is created.)  */
   gdb::unlinker unlink_file (filename.c_str ());
+  file_closer close_out_file (out_file);
 
   mapped_symtab symtab;
   data_buf cu_list;