diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-12-21 09:48:28 -0800 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-12-21 09:48:28 -0800 |
commit | e798f081925b5085de3c9d0f330eb6e255a377bf (patch) | |
tree | cd282295239b3c43a54ab471d31f3c19d2abd301 /gcc | |
parent | 1467a5c5ab0dfbae3175b4a326467f939864dadb (diff) | |
download | gcc-e798f081925b5085de3c9d0f330eb6e255a377bf.zip gcc-e798f081925b5085de3c9d0f330eb6e255a377bf.tar.gz gcc-e798f081925b5085de3c9d0f330eb6e255a377bf.tar.bz2 |
c++: Windows rename [PR 98412]
Some system's rename(2) fails if the target already exists, so delete it
first.
gcc/cp/
* module.cc (create_dirs): Add logging.
(finish_module_processing): Unlink before rename.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/module.cc | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index fc918d2..7e38293 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -4693,6 +4693,7 @@ create_dirs (char *path) char sep = *base; *base = 0; int failed = mkdir (path, S_IRWXU | S_IRWXG | S_IRWXO); + dump () && dump ("Mkdir ('%s') errno:=%u", path, failed ? errno : 0); *base = sep; if (failed /* Maybe racing with another creator (of a *different* @@ -19744,8 +19745,17 @@ finish_module_processing (cpp_reader *reader) input_location = loc; } if (to.end ()) - if (rename (tmp_name, path)) - to.set_error (errno); + { + /* Some OS's do not replace NEWNAME if it already + exists. This'll have a race condition in erroneous + concurrent builds. */ + unlink (path); + if (rename (tmp_name, path)) + { + dump () && dump ("Rename ('%s','%s') errno=%u", errno); + to.set_error (errno); + } + } if (to.get_error ()) { |