summaryrefslogtreecommitdiffstats
path: root/src/disk_interface.cc
diff options
context:
space:
mode:
authorNico Weber <thakis@chromium.org>2014-06-16 16:59:16 (GMT)
committerNico Weber <thakis@chromium.org>2014-06-16 16:59:16 (GMT)
commit4a61415871343250789124837a316a55d4499d1f (patch)
treef9da103e976f6418e50eb437d4c6cb403e957ee6 /src/disk_interface.cc
parented8c2c11b054c9589923e58045b64acc0555f700 (diff)
downloadNinja-4a61415871343250789124837a316a55d4499d1f.zip
Ninja-4a61415871343250789124837a316a55d4499d1f.tar.gz
Ninja-4a61415871343250789124837a316a55d4499d1f.tar.bz2
only use FindExInfoBasic on win7+
Diffstat (limited to 'src/disk_interface.cc')
-rw-r--r--src/disk_interface.cc15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/disk_interface.cc b/src/disk_interface.cc
index 50a2d97..fa0aa3d 100644
--- a/src/disk_interface.cc
+++ b/src/disk_interface.cc
@@ -82,12 +82,23 @@ TimeStamp StatSingleFile(const string& path, bool quiet) {
return TimeStampFromFileTime(attrs.ftLastWriteTime);
}
+bool IsWindows7OrLater() {
+ OSVERSIONINFO version_info = { sizeof(version_info) };
+ if (!GetVersionEx(&version_info))
+ Fatal("GetVersionEx: %s", GetLastErrorString().c_str());
+ return version_info.dwMajorVersion > 6 ||
+ version_info.dwMajorVersion == 6 && version_info.dwMinorVersion >= 1;
+}
+
bool StatAllFilesInDir(const string& dir, map<string, TimeStamp>* stamps,
bool quiet) {
// FindExInfoBasic is 30% faster than FindExInfoStandard.
+ static bool can_use_basic_info = IsWindows7OrLater();
+ FINDEX_INFO_LEVELS level =
+ can_use_basic_info ? FindExInfoBasic : FindExInfoStandard;
WIN32_FIND_DATAA ffd;
- HANDLE find_handle = FindFirstFileExA((dir + "\\*").c_str(), FindExInfoBasic,
- &ffd, FindExSearchNameMatch, NULL, 0);
+ HANDLE find_handle = FindFirstFileExA((dir + "\\*").c_str(), level, &ffd,
+ FindExSearchNameMatch, NULL, 0);
if (find_handle == INVALID_HANDLE_VALUE) {
DWORD err = GetLastError();