[patch lto]: PR/47241 GCC part

Kai Tietz ktietz70@googlemail.com
Wed Feb 9 19:16:00 GMT 2011


Hello,

As for windows native targets unlink isn't possible on still opened files, it is
important to prevent dangling file-descriptors, which are closed not
until application's
exit.

2011-02-09  Kai Tietz

	PR lto/47241
	* lto.c (lto_read_section_data): Free
	fd_name in failure case.
	For mingw targets don't hash file-descriptor.
	(read_cgraph_and_symbols): Close current_lto_file
	in failure case.


Tested for x86_64-pc-linux-gnu, and x86_64-w64-mingw32. Ok for apply?

Regards,
Kai


-- 
|  (\_/) This is Bunny. Copy and paste
| (='.'=) Bunny into your signature to help
| (")_(") him gain world domination
-------------- next part --------------
Index: gcc/gcc/lto/lto.c
===================================================================
--- gcc.orig/gcc/lto/lto.c	2011-01-11 20:36:21.000000000 +0100
+++ gcc/gcc/lto/lto.c	2011-02-09 20:02:40.291549900 +0100
@@ -593,7 +593,11 @@ lto_read_section_data (struct lto_file_d
       fd_name = xstrdup (file_data->file_name);
       fd = open (file_data->file_name, O_RDONLY|O_BINARY);
       if (fd == -1)
-	return NULL;
+        {
+          free (fd_name);
+          fd_name = NULL;
+	  return NULL;
+	}
     }
 
 #if LTO_MMAP_IO
@@ -619,9 +623,17 @@ lto_read_section_data (struct lto_file_d
       || read (fd, result, len) != (ssize_t) len)
     {
       free (result);
-      return NULL;
+      result = NULL;
     }
-
+#ifdef __MINGW32__
+  /* Native windows doesn't supports delayed unlink on opened file. So
+     We close file here again. This produces higher I/O load, but at least
+     it prevents to have dangling file handles preventing unlink.  */
+  free (fd_name);
+  fd_name = NULL;
+  close (fd);
+  fd = -1;
+#endif
   return result;
 #endif
 }    
@@ -2147,7 +2159,11 @@ read_cgraph_and_symbols (unsigned nfiles
 
       file_data = lto_file_read (current_lto_file, resolution, &count);
       if (!file_data)
-	break;
+	{
+	  lto_obj_file_close (current_lto_file);
+	  current_lto_file = NULL;
+	  break;
+	}
 
       decl_data[last_file_ix++] = file_data;
 


More information about the Gcc-patches mailing list