#ifndef MRT_PAGE_CACHE_H
#define MRT_PAGE_CACHE_H
#include "Base/ImmortalWrapper.h"
#include "MemCommon.h"
namespace MapleRuntime {
class PageCache {
public:
static PageCache* GetInstance() { return &*instance; }
Span* NewSpan(size_t k);
std::mutex& GetPageMutex();
Span* MapObjectToSpan(void* obj);
void ReleaseSpanToPageCache(Span* span);
private:
friend class ImmortalWrapper<PageCache>;
std::mutex pageMtx;
SpanList pageCacheSpans[MAX_NPAGES];
std::unordered_map<pageID, Span*> idSpanMap;
private:
PageCache() noexcept {}
PageCache(const PageCache&) = delete;
PageCache& operator=(const PageCache&) = delete;
static ImmortalWrapper<PageCache> instance;
};
class ScopedPageCacheMutex {
public:
explicit ScopedPageCacheMutex() { PageCache::GetInstance()->GetPageMutex().lock(); }
~ScopedPageCacheMutex() { PageCache::GetInstance()->GetPageMutex().unlock(); }
};
}
#endif