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
This commit is contained in:
parent
22e0395a10
commit
74daec8cf2
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user