diff options
author | Nico Weber <thakis@chromium.org> | 2014-06-15 21:42:42 (GMT) |
---|---|---|
committer | Nico Weber <thakis@chromium.org> | 2014-06-15 21:42:42 (GMT) |
commit | 4eb8309251c4839de25502a5390270b53d9706eb (patch) | |
tree | 29aa26c325dd1d635482f811fa6c4895c99a1e98 /src | |
parent | 726afc8226a10cd6c5ce724a845ff5cd17169091 (diff) | |
download | Ninja-4eb8309251c4839de25502a5390270b53d9706eb.zip Ninja-4eb8309251c4839de25502a5390270b53d9706eb.tar.gz Ninja-4eb8309251c4839de25502a5390270b53d9706eb.tar.bz2 |
add some statcache tests
Diffstat (limited to 'src')
-rw-r--r-- | src/disk_interface.cc | 16 | ||||
-rw-r--r-- | src/disk_interface.h | 4 | ||||
-rw-r--r-- | src/disk_interface_test.cc | 27 | ||||
-rw-r--r-- | src/ninja.cc | 4 |
4 files changed, 43 insertions, 8 deletions
diff --git a/src/disk_interface.cc b/src/disk_interface.cc index ff86ed1..c4531e6 100644 --- a/src/disk_interface.cc +++ b/src/disk_interface.cc @@ -81,7 +81,7 @@ TimeStamp StatSingleFile(const string& path, bool quiet) { return TimeStampFromFileTime(attrs.ftLastWriteTime); } -void StatAllFilesInDir(const string& dir, map<string, TimeStamp>* stamps, +bool StatAllFilesInDir(const string& dir, map<string, TimeStamp>* stamps, bool quiet) { // FindExInfoBasic is 30% faster than FindExInfoStandard. WIN32_FIND_DATAA ffd; @@ -90,11 +90,13 @@ void StatAllFilesInDir(const string& dir, map<string, TimeStamp>* stamps, if (hFind == INVALID_HANDLE_VALUE) { DWORD err = GetLastError(); - if (err != ERROR_FILE_NOT_FOUND && err != ERROR_PATH_NOT_FOUND && !quiet) { + if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND) + return true; + if (!quiet) { Error("FindFirstFileExA(%s): %s", dir.c_str(), GetLastErrorString().c_str()); } - return; + return false; } do { if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) @@ -105,6 +107,7 @@ void StatAllFilesInDir(const string& dir, map<string, TimeStamp>* stamps, TimeStampFromFileTime(ffd.ftLastWriteTime))); } while (FindNextFileA(hFind, &ffd)); FindClose(hFind); + return true; } } // namespace @@ -153,7 +156,10 @@ TimeStamp RealDiskInterface::Stat(const string& path) { Cache::iterator ci = cache_.find(dir); if (ci == cache_.end()) { DirCache* dc = new DirCache; - StatAllFilesInDir(dir.empty() ? "." : dir, dc, quiet_); + if (!StatAllFilesInDir(dir.empty() ? "." : dir, dc, quiet_)) { + delete dc; + return -1; + } ci = cache_.insert(make_pair(dir, dc)).first; } DirCache::iterator di = ci->second->find(base); @@ -231,7 +237,7 @@ int RealDiskInterface::RemoveFile(const string& path) { } } -void RealDiskInterface::AllowCache(bool allow) { +void RealDiskInterface::AllowStatCache(bool allow) { #ifdef _WIN32 use_cache_ = allow; if (!use_cache_) diff --git a/src/disk_interface.h b/src/disk_interface.h index 40c24b6..a8a3023 100644 --- a/src/disk_interface.h +++ b/src/disk_interface.h @@ -72,7 +72,9 @@ struct RealDiskInterface : public DiskInterface { bool quiet_; /// Whether stat information can be cached. - void AllowCache(bool allow); + void AllowStatCache(bool allow); + + private: #ifdef _WIN32 /// Whether stat information can be cached. bool use_cache_; diff --git a/src/disk_interface_test.cc b/src/disk_interface_test.cc index 51a1d14..69fd1ab 100644 --- a/src/disk_interface_test.cc +++ b/src/disk_interface_test.cc @@ -76,6 +76,33 @@ TEST_F(DiskInterfaceTest, StatExistingFile) { EXPECT_GT(disk_.Stat("file"), 1); } +#ifdef _WIN32 +TEST_F(DiskInterfaceTest, StatCache) { + disk_.AllowStatCache(true); + + ASSERT_TRUE(Touch("file1")); + ASSERT_TRUE(Touch("fiLE2")); + ASSERT_TRUE(disk_.MakeDir("subdir")); + ASSERT_TRUE(Touch("subdir\\subfile1")); + ASSERT_TRUE(Touch("subdir\\SUBFILE2")); + ASSERT_TRUE(Touch("subdir\\SUBFILE3")); + + EXPECT_GT(disk_.Stat("FIle1"), 1); + EXPECT_GT(disk_.Stat("file1"), 1); + + EXPECT_GT(disk_.Stat("subdir/subfile2"), 1); + EXPECT_GT(disk_.Stat("sUbdir\\suBFile1"), 1); + + // Test error cases. + disk_.quiet_ = true; + string bad_path("cc:\\foo"); + EXPECT_EQ(-1, disk_.Stat(bad_path)); + EXPECT_EQ(-1, disk_.Stat(bad_path)); + EXPECT_EQ(0, disk_.Stat("nosuchfile")); + EXPECT_EQ(0, disk_.Stat("nosuchdir/nosuchfile")); +} +#endif + TEST_F(DiskInterfaceTest, ReadFile) { string err; EXPECT_EQ("", disk_.ReadFile("foobar", &err)); diff --git a/src/ninja.cc b/src/ninja.cc index eedfec0..e555df4 100644 --- a/src/ninja.cc +++ b/src/ninja.cc @@ -889,7 +889,7 @@ int NinjaMain::RunBuild(int argc, char** argv) { return 1; } - disk_interface_.AllowCache(g_experimental_win_statcache); + disk_interface_.AllowStatCache(g_experimental_win_statcache); Builder builder(&state_, config_, &build_log_, &deps_log_, &disk_interface_); for (size_t i = 0; i < targets.size(); ++i) { @@ -905,7 +905,7 @@ int NinjaMain::RunBuild(int argc, char** argv) { } // Make sure restat rules do not see stale timestamps. - disk_interface_.AllowCache(false); + disk_interface_.AllowStatCache(false); if (builder.AlreadyUpToDate()) { printf("ninja: no work to do.\n"); |