aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/jcf-write.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/java/jcf-write.c')
-rw-r--r--gcc/java/jcf-write.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index 2988c47..62e3e09 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -3374,16 +3374,28 @@ write_classfile (clas)
if (class_file_name != NULL)
{
- FILE *stream = fopen (class_file_name, "wb");
+ FILE *stream;
+ char *temporary_file_name;
+
+ /* The .class file is initially written to a ".tmp" file so that
+ if multiple instances of the compiler are running at once
+ they do not see partially formed class files. */
+ temporary_file_name = xmalloc (strlen (class_file_name)
+ + strlen (".tmp") + 1);
+ sprintf (temporary_file_name, "%s.tmp", class_file_name);
+ stream = fopen (temporary_file_name, "wb");
if (stream == NULL)
- fatal_io_error ("can't open %s for writing", class_file_name);
+ fatal_io_error ("can't open %s for writing", temporary_file_name);
jcf_dependency_add_target (class_file_name);
init_jcf_state (state, work);
chunks = generate_classfile (clas, state);
write_chunks (stream, chunks);
if (fclose (stream))
- fatal_io_error ("error closing %s", class_file_name);
+ fatal_io_error ("error closing %s", temporary_file_name);
+ if (rename (temporary_file_name, class_file_name) == -1)
+ fatal_io_error ("can't create %s", class_file_name);
+ free (temporary_file_name);
free (class_file_name);
}
release_jcf_state (state);