From 74daec8cf211dc4bc322ec9ee5a6e992122ceb45 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hongjiu.lu@intel.com>
Date: Mon, 12 Dec 2005 15:27:43 +0000
Subject: [PATCH] re PR java/25330 (A race condition in write_classfile)

2005-12-12  H.J. Lu  <hongjiu.lu@intel.com>

	PR java/25330
	* jcf-write.c (write_classfile): Use PID in temporary class
	file. Save/restore errno when reporting error.

From-SVN: r108411
---
 gcc/java/ChangeLog   |  6 ++++++
 gcc/java/jcf-write.c | 12 +++++++++---
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 43859b71bbd4..ec7f2ececb88 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,9 @@
+2005-12-12  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR java/25330
+	* jcf-write.c (write_classfile): Use PID in temporary class
+	file. Save/restore errno when reporting error.
+
 2005-12-10  Terry Laurenzo  <tlaurenzo@gmail.com>
 
 	PR java/9861
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index 45764995143a..caf57d1e8bc6 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -3522,11 +3522,15 @@ write_classfile (tree clas)
     {
       FILE *stream;
       char *temporary_file_name;
+      char pid [sizeof (long) * 2 + 2];
 
-      /* The .class file is initially written to a ".tmp" file so that
+      /* The .class file is initially written to a ".PID" file so that
 	 if multiple instances of the compiler are running at once
-	 they do not see partially formed class files. */
-      temporary_file_name = concat (class_file_name, ".tmp", NULL);
+	 they do not see partially formed class files nor override
+	 each other, which may happen in libjava with parallel build.
+       */
+      sprintf (pid, ".%lx", (unsigned long) getpid ());
+      temporary_file_name = concat (class_file_name, pid, NULL);
       stream = fopen (temporary_file_name, "wb");
       if (stream == NULL)
 	fatal_error ("can't open %s for writing: %m", temporary_file_name);
@@ -3548,7 +3552,9 @@ write_classfile (tree clas)
 
       if (rename (temporary_file_name, class_file_name) == -1)
 	{
+	  int errno_saved = errno;
 	  remove (temporary_file_name);
+	  errno = errno_saved;
 	  fatal_error ("can't create %s: %m", class_file_name);
 	}
       free (temporary_file_name);
-- 
GitLab