代码拉取完成,页面将自动刷新
#include "PageCache.h"
PageCache PageCache::_sInst;
Span* PageCache::NewSpan(size_t k)
{
assert(k > 0);
if (k > NPAGES - 1)
{
Span* kSpan = _spanPool.New();
void* ptr = SystemAlloc(k);
kSpan->_pageId = (PAGE_ID)ptr >> PAGE_SHIFT;
kSpan->_n = k;
kSpan->_objSize = k * (1 << PAGE_SHIFT);
//_idSpanMap[kSpan->_pageId] = kSpan;
_idSpanMap.set(kSpan->_pageId, kSpan);
return kSpan;
}
if (!_spanLists[k].Empty())
{
Span* kSpan = _spanLists[k].PopFront();
for (PAGE_ID i = 0; i < kSpan->_n; i++)
{
//_idSpanMap[kSpan->_pageId + i] = kSpan;
_idSpanMap.set(kSpan->_pageId + i, kSpan);
}
kSpan->_isUse = true;
return kSpan;
}
for (size_t i = k + 1; i < NPAGES; i++)
{
if (!_spanLists[i].Empty())
{
Span* nSpan = _spanLists[i].PopFront();
Span* kSpan = _spanPool.New();
kSpan->_pageId = nSpan->_pageId;
kSpan->_n = k;
kSpan->_objSize = k * (1 << PAGE_SHIFT);
nSpan->_pageId += k;
nSpan->_n -= k;
_spanLists[nSpan->_n].PushFront(nSpan);
kSpan->_objSize = k * (1 << PAGE_SHIFT);
//_idSpanMap[nSpan->_pageId] = nSpan;
//_idSpanMap[nSpan->_pageId + nSpan->_n - 1] = nSpan;
_idSpanMap.set(nSpan->_pageId, nSpan);
_idSpanMap.set(nSpan->_pageId + nSpan->_n - 1, nSpan);
for (PAGE_ID i = 0; i < kSpan->_n; i++)
{
//_idSpanMap[kSpan->_pageId + i] = kSpan;
_idSpanMap.set(kSpan->_pageId + i, kSpan);
}
kSpan->_isUse = true;
return kSpan;
}
}
//ϵͳڴ
Span* span = _spanPool.New();
void* ptr = SystemAlloc(NPAGES - 1);
span->_pageId = (PAGE_ID)ptr>>PAGE_SHIFT;
span->_n = NPAGES - 1;
span->_objSize = span->_n * (1 >> PAGE_SHIFT);
_spanLists[span->_n].PushFront(span);
return NewSpan(k);
}
Span* PageCache::MapObjectToSpan(void* obj)
{
PAGE_ID index = ((PAGE_ID)obj >> PAGE_SHIFT);
//PageCache::_pageMtx.lock();
//auto ret = _idSpanMap.find(index);
Span* ret = (Span*)_idSpanMap.get(index);
//PageCache::_pageMtx.unlock();
//if (ret == _idSpanMap.end())
if (ret == nullptr)
{
assert(false);
return nullptr;
}
else
{
//return ret->second;
return ret;
}
}
void PageCache::ReleaseSpanToPageCache(Span* span)
{
if (span->_n > NPAGES - 1)
{
void* ptr = (void*)(span->_pageId << PAGE_SHIFT);
SystemFree(ptr);
_spanPool.Delete(span);
return;
}
//ǰϲ
while (true)
{
PAGE_ID prev = span->_pageId - 1;
//auto ret = _idSpanMap.find(prev);
//if (ret != _idSpanMap.end()&&!ret->second->_isUse)
//{
// if (span->_n + ret->second->_n > NPAGES - 1)
// break;
// span->_pageId = ret->second->_pageId;
// span->_n += ret->second->_n;
// _spanLists[ret->second->_n].Erase(ret->second);
// _spanPool.Delete(ret->second);
//}
Span* ret = (Span*)_idSpanMap.get(prev);
if (ret != nullptr && !ret->_isUse)
{
if (span->_n + ret->_n > NPAGES - 1)
break;
span->_pageId = ret->_pageId;
span->_n += ret->_n;
_spanLists[ret->_n].Erase(ret);
_spanPool.Delete(ret);
}
else break;
}
//ϲ
while (true)
{
PAGE_ID next = span->_pageId + span->_n;
//auto nextptr = _idSpanMap.find(next);
//if (nextptr != _idSpanMap.end() && !nextptr->second->_isUse)
//{
// if (span->_n + nextptr->second->_n > NPAGES - 1)
// break;
// span->_n += nextptr->second->_n;
// _spanLists[nextptr->second->_n].Erase(nextptr->second);
// _spanPool.Delete(nextptr->second);
//}
Span* nextptr = (Span*)_idSpanMap.get(next);
if (nextptr != nullptr && !nextptr->_isUse)
{
if (span->_n + nextptr->_n > NPAGES - 1)
break;
span->_n += nextptr->_n;
_spanLists[nextptr->_n].Erase(nextptr);
_spanPool.Delete(nextptr);
}
else break;
}
span->_isUse = false;
_spanLists[span->_n].PushFront(span);
//_idSpanMap[span->_pageId] = span;
//_idSpanMap[span->_pageId + span->_n - 1] = span;
_idSpanMap.set(span->_pageId, span);
_idSpanMap.set(span->_pageId + span->_n - 1, span);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。