summaryrefslogtreecommitdiff
path: root/meta-arm/meta-arm-bsp/recipes-bsp/external-system/files/race.patch
blob: c6bc4f2234971fb926b18ee341b5e4caed3779f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Upstream-Status: Submitted [https://gitlab.arm.com/arm-reference-solutions/corstone1000/external_system/rtx/-/issues/1]
Signed-off-by: Ross Burton <ross.burton@arm.com>

From 34e1c04534607f5605255f39fb46e26261fc9c4e Mon Sep 17 00:00:00 2001
From: Ross Burton <ross.burton@arm.com>
Date: Tue, 8 Sep 2020 11:49:08 +0100
Subject: [PATCH] tools/gen_module_code: atomically rewrite the generated files

The gen_module rule in rules.mk is marked as .PHONY, so make will
execute it whenever it is mentioned. This results in gen_module_code
being executed 64 times for a Juno build.

However in heavily parallel builds there's a good chance that
gen_module_code is writing a file whilst the compiler is reading it
because make also doesn't know what files are generated by
gen_module_code.

The correct fix is to adjust the Makefiles so that the dependencies are
correct but this isn't trivial, so band-aid the problem by atomically
writing the generated files.

Change-Id: I82d44f9ea6537a91002e1f80de8861d208571630
Signed-off-by: Ross Burton <ross.burton@arm.com>
---
 tools/gen_module_code.py | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/tools/gen_module_code.py b/tools/gen_module_code.py
index 7b3953845..ee099b713 100755
--- a/tools/gen_module_code.py
+++ b/tools/gen_module_code.py
@@ -17,6 +17,7 @@
 import argparse
 import os
 import sys
+import tempfile
 
 DEFAULT_PATH = 'build/'
 
@@ -53,13 +54,21 @@
 
 def generate_file(path, filename, content):
     full_filename = os.path.join(path, filename)
-    with open(full_filename, 'a+') as f:
-        f.seek(0)
-        if f.read() != content:
+
+    try:
+        with open(full_filename) as f:
+            rewrite = f.read() != content
+    except FileNotFoundError:
+        rewrite = True
+
+    if rewrite:
+        with tempfile.NamedTemporaryFile(prefix="gen-module-code",
+                                         dir=path,
+                                         delete=False,
+                                         mode="wt") as f:
             print("[GEN] {}...".format(full_filename))
-            f.seek(0)
-            f.truncate()
             f.write(content)
+        os.replace(f.name, full_filename)
 
 
 def generate_header(path, modules):