summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNico Weber <thakis@chromium.org>2014-06-15 21:42:42 (GMT)
committerNico Weber <thakis@chromium.org>2014-06-15 21:42:42 (GMT)
commit4eb8309251c4839de25502a5390270b53d9706eb (patch)
tree29aa26c325dd1d635482f811fa6c4895c99a1e98 /src
parent726afc8226a10cd6c5ce724a845ff5cd17169091 (diff)
downloadNinja-4eb8309251c4839de25502a5390270b53d9706eb.zip
Ninja-4eb8309251c4839de25502a5390270b53d9706eb.tar.gz
Ninja-4eb8309251c4839de25502a5390270b53d9706eb.tar.bz2
add some statcache tests
Diffstat (limited to 'src')
-rw-r--r--src/disk_interface.cc16
-rw-r--r--src/disk_interface.h4
-rw-r--r--src/disk_interface_test.cc27
-rw-r--r--src/ninja.cc4
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");