summaryrefslogtreecommitdiff
path: root/mesonbuild/coredata.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2018-05-15 23:27:42 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2018-05-18 16:17:39 +0300
commitd1287ed321d78848a9d544497edb5c7b239680e5 (patch)
tree1bb11761a3180cda1a5cc819f46c96bcf4419bd7 /mesonbuild/coredata.py
parent8a9f7cf1332a0be9b2e90d39483c6aa7c67fffee (diff)
downloadmeson-atomiccoredata.tar.gz
Write coredata transactionally. Closes #3511.atomiccoredata
Diffstat (limited to 'mesonbuild/coredata.py')
-rw-r--r--mesonbuild/coredata.py11
1 files changed, 10 insertions, 1 deletions
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
index a1dbac821..f3313f3f9 100644
--- a/mesonbuild/coredata.py
+++ b/mesonbuild/coredata.py
@@ -354,10 +354,19 @@ def load(build_dir):
def save(obj, build_dir):
filename = os.path.join(build_dir, 'meson-private', 'coredata.dat')
+ prev_filename = filename + '.prev'
+ tempfilename = filename + '~'
if obj.version != version:
raise MesonException('Fatal version mismatch corruption.')
- with open(filename, 'wb') as f:
+ if os.path.exists(filename):
+ import shutil
+ shutil.copyfile(filename, prev_filename)
+ with open(tempfilename, 'wb') as f:
pickle.dump(obj, f)
+ f.flush()
+ os.fsync(f.fileno())
+ os.replace(tempfilename, filename)
+ return filename
def get_builtin_options():
return list(builtin_options.keys())