Luna/kernel/src/fs/StorageCache.cpp

50 lines
1.0 KiB
C++
Raw Normal View History

#include "fs/StorageCache.h"
#include "Log.h"
#include <luna/Heap.h>
#include <luna/ScopeGuard.h>
static LinkedList<StorageCache> g_storage_caches;
Result<StorageCache::CacheEntry*> StorageCache::fetch_entry(u64 block)
{
{
CacheEntry* entry = m_cache_entries.try_get_ref(block);
if (entry && !entry->buffer.is_empty()) return entry;
}
CacheEntry entry {};
TRY(m_cache_entries.try_set(block, move(entry)));
#ifdef CACHE_DEBUG
kdbgln("cache: Created new cache entry for block %lu", block);
#endif
return m_cache_entries.try_get_ref(block);
}
void StorageCache::clear()
{
m_mutex.lock();
kdbgln("cache: clearing %lu entries, out of %lu buckets", m_cache_entries.size(), m_cache_entries.capacity());
m_cache_entries.clear();
kdbgln("cache: done");
m_mutex.unlock();
}
StorageCache::StorageCache()
{
g_storage_caches.append(this);
}
StorageCache::~StorageCache()
{
g_storage_caches.remove(this);
}
void StorageCache::clear_caches()
{
for (auto* cache : g_storage_caches) { cache->clear(); }
}