PATCH: java/25330: A race condition in write_classfile
H. J. Lu
hjl@lucon.org
Sat Dec 10 22:03:00 GMT 2005
With parallel build in libjava, several processes may want to generate
the same class file. They are using the same temporary class file. They
may override each other. This patch uses PID in temporary class file
to avoid it.
H.J.
---
2005-12-10 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.
--- gcc/java/jcf-write.c.race 2005-12-10 13:06:29.000000000 -0800
+++ gcc/java/jcf-write.c 2005-12-10 13:22:53.000000000 -0800
@@ -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);
More information about the Java-patches
mailing list