diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2018-05-15 23:27:42 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2018-05-18 16:17:39 +0300 |
commit | d1287ed321d78848a9d544497edb5c7b239680e5 (patch) | |
tree | 1bb11761a3180cda1a5cc819f46c96bcf4419bd7 /mesonbuild/coredata.py | |
parent | 8a9f7cf1332a0be9b2e90d39483c6aa7c67fffee (diff) | |
download | meson-atomiccoredata.tar.gz |
Write coredata transactionally. Closes #3511.atomiccoredata
Diffstat (limited to 'mesonbuild/coredata.py')
-rw-r--r-- | mesonbuild/coredata.py | 11 |
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()) |