由于CentralCache在全局中只存在一个实例,因此设置为单例,PageCache同理
声明CentralCache类
class CentralCache
{
private:
CentralCache() {
}
CentralCache(const CentralCache&) = delete;
CentralCache& operator=(const CentralCache&) = delete;
private:
SpanList _spanlists[NUM_LIST];
static CentralCache* self;
Span* GetOneSpan(SpanList& spanlist, size_t bytes); //获取一个span对象,可能从桶中中取,也可能从pagecache取
public:
static CentralCache* GetInstance(); //获取单例对象
size_t FetchRangeObj(void*& start, void*& end, size_t batchnum, size_t bytes); //提取batchnum个大小为bytes的空间块,start和end指向表头和表尾
void RecoverFromThreadCache(void* start, size_t bytes); //从threadcache中回收一段闲置空间
};
RecoverFromThreadCache方法实现
void CentralCache::RecoverFromThreadCache(void* start, size_t bytes) //每一小块空间需要找到其对应的span
{
size_t index = SizeMap::Index(bytes);
_spanlists[index]._mtx.