diff options
author | Michael Olbrich <m.olbrich@pengutronix.de> | 2018-04-12 10:36:54 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-04-14 01:55:51 +0200 |
commit | 43dd0062229170747dcbee0a2a87b8e5ee2f09d6 (patch) | |
tree | 5b2936d00438b86e327dc56cf025c96a4faa4773 | |
parent | c783cf78af04e898a20f69f28b885f7c0285020c (diff) | |
download | busybox-w32-43dd0062229170747dcbee0a2a87b8e5ee2f09d6.tar.gz busybox-w32-43dd0062229170747dcbee0a2a87b8e5ee2f09d6.tar.bz2 busybox-w32-43dd0062229170747dcbee0a2a87b8e5ee2f09d6.zip |
build system: fix parallel building issue
The files generated by the include/config/MARKER target are in the
dependency list for applets/applet_tables.
If applets/applet_tables is created first during applets_dir then it will
be created again later as part of $(busybox-dirs).
As a result include/applet_tables.h is created again. This time while other
build commands may need it.
Let applets_dir depend on include/config/MARKER to avoid this particular
race condition and create the header files atomically to ensure that the
compiler never sees incomplete files.
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | applets/applet_tables.c | 16 |
2 files changed, 15 insertions, 3 deletions
@@ -368,7 +368,7 @@ gen_build_files: $(wildcard $(srctree)/*/*.c) $(wildcard $(srctree)/*/*/*.c) | |||
368 | # we depend on scripts_basic, since scripts/basic/fixdep | 368 | # we depend on scripts_basic, since scripts/basic/fixdep |
369 | # must be built before any other host prog | 369 | # must be built before any other host prog |
370 | PHONY += applets_dir | 370 | PHONY += applets_dir |
371 | applets_dir: scripts_basic gen_build_files | 371 | applets_dir: scripts_basic gen_build_files include/config/MARKER |
372 | $(Q)$(MAKE) $(build)=applets | 372 | $(Q)$(MAKE) $(build)=applets |
373 | 373 | ||
374 | applets/%: applets_dir ; | 374 | applets/%: applets_dir ; |
diff --git a/applets/applet_tables.c b/applets/applet_tables.c index ef911a43b..e3d10c83f 100644 --- a/applets/applet_tables.c +++ b/applets/applet_tables.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <sys/types.h> | 10 | #include <sys/types.h> |
11 | #include <sys/stat.h> | 11 | #include <sys/stat.h> |
12 | #include <fcntl.h> | 12 | #include <fcntl.h> |
13 | #include <limits.h> | ||
13 | #include <stdlib.h> | 14 | #include <stdlib.h> |
14 | #include <string.h> | 15 | #include <string.h> |
15 | #include <stdio.h> | 16 | #include <stdio.h> |
@@ -61,6 +62,7 @@ static int str_isalnum_(const char *s) | |||
61 | int main(int argc, char **argv) | 62 | int main(int argc, char **argv) |
62 | { | 63 | { |
63 | int i, j; | 64 | int i, j; |
65 | char tmp1[PATH_MAX], tmp2[PATH_MAX]; | ||
64 | 66 | ||
65 | // In find_applet_by_name(), before linear search, narrow it down | 67 | // In find_applet_by_name(), before linear search, narrow it down |
66 | // by looking at N "equidistant" names. With ~350 applets: | 68 | // by looking at N "equidistant" names. With ~350 applets: |
@@ -84,7 +86,8 @@ int main(int argc, char **argv) | |||
84 | 86 | ||
85 | if (!argv[1]) | 87 | if (!argv[1]) |
86 | return 1; | 88 | return 1; |
87 | i = open(argv[1], O_WRONLY | O_TRUNC | O_CREAT, 0666); | 89 | snprintf(tmp1, PATH_MAX, "%s.%u.new", argv[1], (int) getpid()); |
90 | i = open(tmp1, O_WRONLY | O_TRUNC | O_CREAT, 0666); | ||
88 | if (i < 0) | 91 | if (i < 0) |
89 | return 1; | 92 | return 1; |
90 | dup2(i, 1); | 93 | dup2(i, 1); |
@@ -209,12 +212,21 @@ int main(int argc, char **argv) | |||
209 | // fclose(fp); | 212 | // fclose(fp); |
210 | // } | 213 | // } |
211 | // if (strcmp(line_old, line_new) != 0) { | 214 | // if (strcmp(line_old, line_new) != 0) { |
212 | fp = fopen(argv[2], "w"); | 215 | snprintf(tmp2, PATH_MAX, "%s.%u.new", argv[2], (int) getpid()); |
216 | fp = fopen(tmp2, "w"); | ||
213 | if (!fp) | 217 | if (!fp) |
214 | return 1; | 218 | return 1; |
215 | fputs(line_new, fp); | 219 | fputs(line_new, fp); |
220 | if (fclose(fp)) | ||
221 | return 1; | ||
216 | // } | 222 | // } |
217 | } | 223 | } |
218 | 224 | ||
225 | if (fclose(stdout)) | ||
226 | return 1; | ||
227 | if (rename(tmp1, argv[1])) | ||
228 | return 1; | ||
229 | if (rename(tmp2, argv[2])) | ||
230 | return 1; | ||
219 | return 0; | 231 | return 0; |
220 | } | 232 | } |