summaryrefslogtreecommitdiffstats
path: root/Source/cmSystemTools.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2020-08-27 20:52:14 (GMT)
committerBrad King <brad.king@kitware.com>2020-08-27 21:02:03 (GMT)
commit35039286eb6e1fe6161524481bebda9bcd30bb84 (patch)
tree18b327cdfa0b55a1ac924c0cbf7dd9a4db55eff5 /Source/cmSystemTools.cxx
parent750556b3c812e24eb5449ff7580ccd5cf3717df5 (diff)
downloadCMake-35039286eb6e1fe6161524481bebda9bcd30bb84.zip
CMake-35039286eb6e1fe6161524481bebda9bcd30bb84.tar.gz
CMake-35039286eb6e1fe6161524481bebda9bcd30bb84.tar.bz2
cmSystemTools: Define directory-specific Windows filesystem retry settings
Inspired-by: Ron W Moore <webbtrail@gmail.com>
Diffstat (limited to 'Source/cmSystemTools.cxx')
-rw-r--r--Source/cmSystemTools.cxx89
1 files changed, 67 insertions, 22 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 798c29a..8112fee 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -749,33 +749,78 @@ std::string cmSystemTools::FileExistsInParentDirectories(
}
#ifdef _WIN32
-cmSystemTools::WindowsFileRetry cmSystemTools::GetWindowsFileRetry()
+namespace {
+
+struct WindowsFileRetryInit
{
- static WindowsFileRetry retry = { 0, 0 };
- if (!retry.Count) {
- unsigned int data[2] = { 0, 0 };
- HKEY const keys[2] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
- wchar_t const* const values[2] = { L"FilesystemRetryCount",
- L"FilesystemRetryDelay" };
- for (int k = 0; k < 2; ++k) {
- HKEY hKey;
- if (RegOpenKeyExW(keys[k], L"Software\\Kitware\\CMake\\Config", 0,
- KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
- for (int v = 0; v < 2; ++v) {
- DWORD dwData, dwType, dwSize = 4;
- if (!data[v] &&
- RegQueryValueExW(hKey, values[v], 0, &dwType, (BYTE*)&dwData,
- &dwSize) == ERROR_SUCCESS &&
- dwType == REG_DWORD && dwSize == 4) {
- data[v] = static_cast<unsigned int>(dwData);
- }
+ cmSystemTools::WindowsFileRetry Retry;
+ bool Explicit;
+};
+
+WindowsFileRetryInit InitWindowsFileRetry(wchar_t const* const values[2],
+ unsigned int const defaults[2])
+{
+ unsigned int data[2] = { 0, 0 };
+ HKEY const keys[2] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
+ for (int k = 0; k < 2; ++k) {
+ HKEY hKey;
+ if (RegOpenKeyExW(keys[k], L"Software\\Kitware\\CMake\\Config", 0,
+ KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
+ for (int v = 0; v < 2; ++v) {
+ DWORD dwData, dwType, dwSize = 4;
+ if (!data[v] &&
+ RegQueryValueExW(hKey, values[v], 0, &dwType, (BYTE*)&dwData,
+ &dwSize) == ERROR_SUCCESS &&
+ dwType == REG_DWORD && dwSize == 4) {
+ data[v] = static_cast<unsigned int>(dwData);
}
- RegCloseKey(hKey);
}
+ RegCloseKey(hKey);
}
- retry.Count = data[0] ? data[0] : 5;
- retry.Delay = data[1] ? data[1] : 500;
}
+ WindowsFileRetryInit init;
+ init.Explicit = data[0] || data[1];
+ init.Retry.Count = data[0] ? data[0] : defaults[0];
+ init.Retry.Delay = data[1] ? data[1] : defaults[1];
+ return init;
+}
+
+WindowsFileRetryInit InitWindowsFileRetry()
+{
+ static wchar_t const* const values[2] = { L"FilesystemRetryCount",
+ L"FilesystemRetryDelay" };
+ static unsigned int const defaults[2] = { 5, 500 };
+ return InitWindowsFileRetry(values, defaults);
+}
+
+WindowsFileRetryInit InitWindowsDirectoryRetry()
+{
+ static wchar_t const* const values[2] = { L"FilesystemDirectoryRetryCount",
+ L"FilesystemDirectoryRetryDelay" };
+ static unsigned int const defaults[2] = { 120, 500 };
+ WindowsFileRetryInit dirInit = InitWindowsFileRetry(values, defaults);
+ if (dirInit.Explicit) {
+ return dirInit;
+ }
+ WindowsFileRetryInit fileInit = InitWindowsFileRetry();
+ if (fileInit.Explicit) {
+ return fileInit;
+ }
+ return dirInit;
+}
+
+} // end of anonymous namespace
+
+cmSystemTools::WindowsFileRetry cmSystemTools::GetWindowsFileRetry()
+{
+ static WindowsFileRetry retry = InitWindowsFileRetry().Retry;
+ return retry;
+}
+
+cmSystemTools::WindowsFileRetry cmSystemTools::GetWindowsDirectoryRetry()
+{
+ static cmSystemTools::WindowsFileRetry retry =
+ InitWindowsDirectoryRetry().Retry;
return retry;
}
#endif