blob: 629c738eb109371bffc13cedd69f7c2cf377b669 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVELOPER_DEBUG_ZXDB_COMMON_CACHE_DIR_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_COMMON_CACHE_DIR_H_
#include <filesystem>
#include <unordered_map>
namespace zxdb {
// A cache directory automatically removes least recently used files when its size exceeds the
// maximum size. More sophisticated features could be added in the future.
class CacheDir {
public:
// Default size for cache directory.
static constexpr uint64_t kDefaultMaxSize = 8ull * 1024 * 1024 * 1024;
// Declare a cache directory with the maximum size in bytes. When the size of the cache directory
// is larger than the max_size_bytes, an LRU pruning will be triggered. A value of 0 disables the
// cache pruning.
explicit CacheDir(std::filesystem::path dir, uint64_t max_size_bytes = kDefaultMaxSize);
// The caller of this class is able to access, create files in the cache directory directly but
// needs to notify us about the access.
//
// If the file is not in the cache_dir, this function does nothing.
// It's guaranteed that the file won't be deleted by this call.
void NotifyFileAccess(const std::filesystem::path& file);
private:
void PruneDir();
std::filesystem::path cache_dir_;
uint64_t max_size_; // in bytes
struct FileInfo {
uint64_t atime = 0; // in nanoseconds
uint64_t size = 0; // in bytes
};
std::unordered_map<std::string, FileInfo> file_info_;
uint64_t total_size_ = 0;
};
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_COMMON_CACHE_DIR_H_