10 #ifndef hifi_FileCache_h
11 #define hifi_FileCache_h
17 #include <unordered_set>
20 #include <unordered_map>
23 #include <QLoggingCategory>
25 Q_DECLARE_LOGGING_CATEGORY(file_cache)
32 using FilePointer = std::shared_ptr<File>;
34 using FileCachePointer = std::shared_ptr<FileCache>;
35 using FileCacheWeakPointer = std::weak_ptr<FileCache>;
37 class FileCache :
public QObject,
public std::enable_shared_from_this<FileCache> {
39 Q_PROPERTY(
size_t numTotal READ getNumTotalFiles NOTIFY dirty)
40 Q_PROPERTY(
size_t numCached READ getNumCachedFiles NOTIFY dirty)
41 Q_PROPERTY(
size_t sizeTotal READ getSizeTotalFiles NOTIFY dirty)
42 Q_PROPERTY(
size_t sizeCached READ getSizeCachedFiles NOTIFY dirty)
44 static const size_t DEFAULT_MAX_SIZE;
45 static const size_t MAX_MAX_SIZE;
46 static const size_t DEFAULT_MIN_FREE_STORAGE_SPACE;
48 friend class ::FileCacheTests;
53 FileCache(
const std::string& dirname,
const std::string& ext, QObject* parent =
nullptr);
59 size_t getNumTotalFiles()
const {
return _numTotalFiles; }
60 size_t getNumCachedFiles()
const {
return _numUnusedFiles; }
61 size_t getSizeTotalFiles()
const {
return _totalFilesSize; }
62 size_t getSizeCachedFiles()
const {
return _unusedFilesSize; }
65 void setMaxSize(
size_t maxCacheSize);
70 void setMinFreeSize(
size_t size);
72 using Key = std::string;
74 Metadata(
const Key& key,
size_t length) :
75 key(key), length(length) {}
96 virtual void initialize();
99 FilePointer writeFile(
const char* data, Metadata&& metadata,
bool overwrite =
false);
100 FilePointer getFile(
const Key& key);
103 virtual std::unique_ptr<File> createFile(Metadata&& metadata,
const std::string& filepath);
106 using Mutex = std::recursive_mutex;
107 using Lock = std::unique_lock<Mutex>;
108 using Map = std::unordered_map<Key, std::weak_ptr<File>>;
109 using Set = std::unordered_set<FilePointer>;
110 using KeySet = std::unordered_set<Key>;
114 std::string getFilepath(
const Key& key);
116 FilePointer addFile(Metadata&& metadata,
const std::string& filepath);
117 void addUnusedFile(
const FilePointer& file);
118 void releaseFile(File* file);
122 void eject(FilePointer file);
124 size_t getOverbudgetAmount()
const;
128 std::atomic<size_t> _minFreeSpaceSize { DEFAULT_MIN_FREE_STORAGE_SPACE };
129 std::atomic<size_t> _maxSize { DEFAULT_MAX_SIZE };
130 std::atomic<size_t> _numTotalFiles { 0 };
131 std::atomic<size_t> _numUnusedFiles { 0 };
132 std::atomic<size_t> _totalFilesSize { 0 };
133 std::atomic<size_t> _unusedFilesSize { 0 };
135 const std::string _ext;
136 const std::string _dirname;
137 const std::string _dirpath;
138 bool _initialized {
false };
147 using Key = FileCache::Key;
148 using Metadata = FileCache::Metadata;
150 const Key& getKey()
const {
return _key; }
151 const size_t& getLength()
const {
return _length; }
152 const std::string& getFilepath()
const {
return _filepath; }
156 static void deleter(File* file);
160 File(Metadata&& metadata,
const std::string& filepath);
163 friend class FileCache;
164 friend struct FilePointerComparator;
165 friend class ::FileCacheTests;
168 const size_t _length;
169 const std::string _filepath;
172 FileCacheWeakPointer _parent;
173 int64_t _modified { 0 };
174 bool _locked {
false };
176 bool _shouldPersist {
false };