From 281524f4cb2726320ecd87179f0ab84cd45951c8 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 8 May 2002 19:24:42 +0000 Subject: [PATCH] jcf-write.c (write_classfile): Write the file to a temporary file and then rename it. * java/jcf-write.c (write_classfile): Write the file to a temporary file and then rename it. * libjava/Makefile.am (all_java_source_files): New variable. (all_java_class_files): Likewise. .java.class: New rule. (CLEANFILES): Remove tmp-list. * libjava/Makefile.in: Regenerated. From-SVN: r53298 --- gcc/java/ChangeLog | 5 ++ gcc/java/jcf-write.c | 18 +++++-- libjava/ChangeLog | 8 +++ libjava/Makefile.am | 47 ++++++------------ libjava/Makefile.in | 115 ++++++++++++------------------------------- 5 files changed, 73 insertions(+), 120 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 703658df722..502328ebebb 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,8 @@ +2002-05-08 Mark Mitchell + + * java/jcf-write.c (write_classfile): Write the file to a + temporary file and then rename it. + 2002-05-07 Tom Tromey * gjavah.c (throwable_p): Use xstrdup, not strdup. diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c index 2988c4726b8..62e3e09d64b 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); diff --git a/libjava/ChangeLog b/libjava/ChangeLog index ebf72c12696..f507bd1805e 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2002-05-08 Mark Mitchell + + * libjava/Makefile.am (all_java_source_files): New variable. + (all_java_class_files): Likewise. + .java.class: New rule. + (CLEANFILES): Remove tmp-list. + * libjava/Makefile.in: Regenerated. + 2002-05-09 David.Billinghurst * testsuite/lib/libjava.exp (test_libjava_from_javac): diff --git a/libjava/Makefile.am b/libjava/Makefile.am index 118a69f697b..c98b0d1b242 100644 --- a/libjava/Makefile.am +++ b/libjava/Makefile.am @@ -165,45 +165,26 @@ install-exec-hook: $(LN_S) libgcjx.la gnu-awt-xlib.la; \ fi -## Make the .class files depend on the .zip file. This seems -## backwards, but is right. This doesn't catch all the .class files, -## but that is ok, because the ones it fails to pick up are defined in -## a .java file with some other class which is caught. Note that we -## only want to create headers for those files which do not have -## hand-maintained headers. -$(built_java_source_files:.java=.class): libgcj-@gcc_version@.jar -$(java_source_files:.java=.class): libgcj-@gcc_version@.jar - -## The .class files for X will not be included in libgcj.jar, but the -## rule for libgcj.jar will cause all out-of-date .class files to be -## built. We need this to generate headers for the nat-files. -$(x_java_source_files:.java=.class): libgcj-@gcc_version@.jar - -## We have the zip file depend on the java sources and not the class -## files, because we don't know the names of all the class files. -## FIXME: this method fails in a peculiar case: if libgcj.jar is -## up-to-date, and foo.class is removed, and bar.java is touched, then -## `make libgcj.jar' will not rebuilt foo.class. That's because -## libgcj.jar is not out-of-date with respect to foo.java. -libgcj-@gcc_version@.jar: $(built_java_source_files) $(java_source_files) $(x_java_source_files) -## Create a list of all Java sources, without exceeding any shell limits. - @: $(shell echo Creating list of files to compile...) $(shell rm -f tmp-list || :) $(shell touch tmp-list) $(foreach source,$?,$(shell echo $(source) >> tmp-list)) - @set fnord $(MAKEFLAGS); amf=$$2; fail=no; \ - javac="$(JAVAC)"; \ - cat tmp-list | (while read f; do \ - echo $$javac $(JCFLAGS) -classpath \'\' -bootclasspath $(here):$(srcdir) -d $(here) $$f; \ - $$javac $(JCFLAGS) -classpath '' -bootclasspath $(here):$(srcdir) -d $(here) $$f \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes ;; *) exit 1;; esac; \ - done; \ - test "$$fail" = no) - -@rm -f tmp-list libgcj-@gcc_version@.jar +all_java_source_files = \ + $(java_source_files) \ + $(built_java_source_files) \ + $(x_java_source_files) + +all_java_class_files = $(all_java_source_files:.java=.class) + +.java.class: + $(JAVAC) $(JCFLAGS) -classpath '' -bootclasspath $(here):$(srcdir) \ + -d $(here) $< + +libgcj-@gcc_version@.jar: $(all_java_class_files) + -@rm -f libgcj-@gcc_version@.jar ## Note that we explicitly want to include directory information. find java gnu javax org -type d -o -type f -name '*.class' | \ sed -e '/\/\./d' -e '/\/xlib/d' | \ $(ZIP) cfM0E@ $@ MOSTLYCLEANFILES = $(javao_files) $(nat_files) $(nat_headers) $(c_files) $(x_javao_files) $(x_nat_files) $(x_nat_headers) -CLEANFILES = tmp-list libgcj-@gcc_version@.jar +CLEANFILES = libgcj-@gcc_version@.jar clean-local: ## We just remove every .class file that was created. diff --git a/libjava/Makefile.in b/libjava/Makefile.in index 06cbfa6078e..b269ee71ff6 100644 --- a/libjava/Makefile.in +++ b/libjava/Makefile.in @@ -228,8 +228,16 @@ libgcjx_la_LDFLAGS = @X_PRE_LIBS@ @X_LIBS@ -lX11 @X_EXTRA_LIBS@ \ libgcjx_la_LINK = $(LIBLINK) +all_java_source_files = \ + $(java_source_files) \ + $(built_java_source_files) \ + $(x_java_source_files) + + +all_java_class_files = $(all_java_source_files:.java=.class) + MOSTLYCLEANFILES = $(javao_files) $(nat_files) $(nat_headers) $(c_files) $(x_javao_files) $(x_nat_files) $(x_nat_headers) -CLEANFILES = tmp-list libgcj-@gcc_version@.jar +CLEANFILES = libgcj-@gcc_version@.jar SUFFIXES = .class .java .h @@ -1725,9 +1733,8 @@ LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DATA = $(jar_DATA) $(toolexeclib_DATA) DIST_COMMON = README COPYING ChangeLog Makefile.am Makefile.in NEWS \ -THANKS acconfig.h acinclude.m4 aclocal.m4 configure configure.in \ -gcj/libgcj-config.h.in gcj/stamp-h2.in include/config.h.in \ -include/stamp-h1.in libgcj-test.spec.in libgcj.spec.in +THANKS acinclude.m4 aclocal.m4 configure configure.in \ +libgcj-test.spec.in libgcj.spec.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) @@ -2713,53 +2720,6 @@ config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) - -include/config.h: include/stamp-h1 - @if test ! -f $@; then \ - rm -f include/stamp-h1; \ - $(MAKE) include/stamp-h1; \ - else :; fi -include/stamp-h1: $(srcdir)/include/config.h.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES= CONFIG_HEADERS=include/config.h \ - $(SHELL) ./config.status - @echo timestamp > include/stamp-h1 2> /dev/null -$(srcdir)/include/config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/include/stamp-h1.in - @if test ! -f $@; then \ - rm -f $(srcdir)/include/stamp-h1.in; \ - $(MAKE) $(srcdir)/include/stamp-h1.in; \ - else :; fi -$(srcdir)/include/stamp-h1.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h - cd $(top_srcdir) && $(AUTOHEADER) - @echo timestamp > $(srcdir)/include/stamp-h1.in 2> /dev/null - -gcj/libgcj-config.h: gcj/stamp-h2 - @if test ! -f $@; then \ - rm -f gcj/stamp-h2; \ - $(MAKE) gcj/stamp-h2; \ - else :; fi -gcj/stamp-h2: $(srcdir)/gcj/libgcj-config.h.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES= CONFIG_HEADERS=gcj/libgcj-config.h \ - $(SHELL) ./config.status - @echo timestamp > gcj/stamp-h2 2> /dev/null -$(srcdir)/gcj/libgcj-config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/gcj/stamp-h2.in - @if test ! -f $@; then \ - rm -f $(srcdir)/gcj/stamp-h2.in; \ - $(MAKE) $(srcdir)/gcj/stamp-h2.in; \ - else :; fi -$(srcdir)/gcj/stamp-h2.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h - cd $(top_srcdir) && $(AUTOHEADER) - @echo timestamp > $(srcdir)/gcj/stamp-h2.in 2> /dev/null - -mostlyclean-hdr: - -clean-hdr: - -distclean-hdr: - -rm -f include/config.h gcj/libgcj-config.h - -maintainer-clean-hdr: libgcj.spec: $(top_builddir)/config.status libgcj.spec.in cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status libgcj-test.spec: $(top_builddir)/config.status libgcj-test.spec.in @@ -3194,32 +3154,29 @@ distclean-generic: -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: -mostlyclean-am: mostlyclean-hdr mostlyclean-toolexeclibLTLIBRARIES \ - mostlyclean-compile mostlyclean-libtool \ - mostlyclean-binPROGRAMS mostlyclean-noinstPROGRAMS \ - mostlyclean-tags mostlyclean-depend mostlyclean-generic +mostlyclean-am: mostlyclean-toolexeclibLTLIBRARIES mostlyclean-compile \ + mostlyclean-libtool mostlyclean-binPROGRAMS \ + mostlyclean-noinstPROGRAMS mostlyclean-tags \ + mostlyclean-depend mostlyclean-generic mostlyclean: mostlyclean-recursive -clean-am: clean-hdr clean-toolexeclibLTLIBRARIES clean-compile \ - clean-libtool clean-binPROGRAMS clean-noinstPROGRAMS \ - clean-tags clean-depend clean-generic mostlyclean-am \ - clean-local +clean-am: clean-toolexeclibLTLIBRARIES clean-compile clean-libtool \ + clean-binPROGRAMS clean-noinstPROGRAMS clean-tags \ + clean-depend clean-generic mostlyclean-am clean-local clean: clean-recursive -distclean-am: distclean-hdr distclean-toolexeclibLTLIBRARIES \ - distclean-compile distclean-libtool \ - distclean-binPROGRAMS distclean-noinstPROGRAMS \ - distclean-tags distclean-depend distclean-generic \ - clean-am +distclean-am: distclean-toolexeclibLTLIBRARIES distclean-compile \ + distclean-libtool distclean-binPROGRAMS \ + distclean-noinstPROGRAMS distclean-tags \ + distclean-depend distclean-generic clean-am -rm -f libtool distclean: distclean-recursive -rm -f config.status -maintainer-clean-am: maintainer-clean-hdr \ - maintainer-clean-toolexeclibLTLIBRARIES \ +maintainer-clean-am: maintainer-clean-toolexeclibLTLIBRARIES \ maintainer-clean-compile maintainer-clean-libtool \ maintainer-clean-binPROGRAMS \ maintainer-clean-noinstPROGRAMS maintainer-clean-tags \ @@ -3231,9 +3188,9 @@ maintainer-clean-am: maintainer-clean-hdr \ maintainer-clean: maintainer-clean-recursive -rm -f config.status -.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ -mostlyclean-toolexeclibLTLIBRARIES distclean-toolexeclibLTLIBRARIES \ -clean-toolexeclibLTLIBRARIES maintainer-clean-toolexeclibLTLIBRARIES \ +.PHONY: mostlyclean-toolexeclibLTLIBRARIES \ +distclean-toolexeclibLTLIBRARIES clean-toolexeclibLTLIBRARIES \ +maintainer-clean-toolexeclibLTLIBRARIES \ uninstall-toolexeclibLTLIBRARIES install-toolexeclibLTLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile mostlyclean-libtool distclean-libtool \ @@ -3266,22 +3223,12 @@ install-exec-hook: $(LN_S) libgcjx.la gnu-awt-xlib.la; \ fi -$(built_java_source_files:.java=.class): libgcj-@gcc_version@.jar -$(java_source_files:.java=.class): libgcj-@gcc_version@.jar +.java.class: + $(JAVAC) $(JCFLAGS) -classpath '' -bootclasspath $(here):$(srcdir) \ + -d $(here) $< -$(x_java_source_files:.java=.class): libgcj-@gcc_version@.jar - -libgcj-@gcc_version@.jar: $(built_java_source_files) $(java_source_files) $(x_java_source_files) - @: $(shell echo Creating list of files to compile...) $(shell rm -f tmp-list || :) $(shell touch tmp-list) $(foreach source,$?,$(shell echo $(source) >> tmp-list)) - @set fnord $(MAKEFLAGS); amf=$$2; fail=no; \ - javac="$(JAVAC)"; \ - cat tmp-list | (while read f; do \ - echo $$javac $(JCFLAGS) -classpath \'\' -bootclasspath $(here):$(srcdir) -d $(here) $$f; \ - $$javac $(JCFLAGS) -classpath '' -bootclasspath $(here):$(srcdir) -d $(here) $$f \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes ;; *) exit 1;; esac; \ - done; \ - test "$$fail" = no) - -@rm -f tmp-list libgcj-@gcc_version@.jar +libgcj-@gcc_version@.jar: $(all_java_class_files) + -@rm -f libgcj-@gcc_version@.jar find java gnu javax org -type d -o -type f -name '*.class' | \ sed -e '/\/\./d' -e '/\/xlib/d' | \ $(ZIP) cfM0E@ $@ -- 2.30.2