blob: f1cd8964398abcd70c6972c96713199e5e43691f [file] [log] [blame]
// Copyright 2018 The Goma Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "sha256_hash_cache.h"
#include "autolock_timer.h"
#include "goma_hash.h"
namespace devtools_goma {
bool SHA256HashCache::GetHashFromCacheOrFile(const std::string& path,
std::string* hash) {
total_.Add(1);
FileStat filestat(path);
if (!filestat.IsValid()) {
return false;
}
{
AUTO_SHARED_LOCK(lock, &mu_);
const auto& it = cache_.find(path);
if (it != cache_.end() && !filestat.CanBeNewerThan(it->second.first)) {
*hash = it->second.second;
hit_.Add(1);
return true;
}
}
if (!GomaSha256FromFile(path, hash)) {
return false;
}
if (filestat.CanBeStale()) {
return true;
}
AUTO_EXCLUSIVE_LOCK(lock, &mu_);
cache_[path] = std::make_pair(filestat, *hash);
return true;
}
} // namespace devtools_goma