diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2005-12-12 15:27:43 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2005-12-12 07:27:43 -0800 |
commit | 74daec8cf211dc4bc322ec9ee5a6e992122ceb45 (patch) | |
tree | 8db93f717f2fce3d6e3be76fff3b14c7fda1c8a8 /gcc/java/jcf-write.c | |
parent | 22e0395a104807767c1dda3e97ba8a44d435dee7 (diff) | |
download | gcc-74daec8cf211dc4bc322ec9ee5a6e992122ceb45.zip gcc-74daec8cf211dc4bc322ec9ee5a6e992122ceb45.tar.gz gcc-74daec8cf211dc4bc322ec9ee5a6e992122ceb45.tar.bz2 |
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
Diffstat (limited to 'gcc/java/jcf-write.c')
-rw-r--r-- | gcc/java/jcf-write.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c index 4576499..caf57d1 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); |