1 Star 0 Fork 0

敲上瘾/ConcurrentMemoryPool

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
PageCache.cpp 3.80 KB
一键复制 编辑 原始数据 按行查看 历史
敲上瘾 提交于 2025-04-29 23:51 +08:00 . 高并发内存池5
#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);
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/byteUUM/concurrent-memory-pool.git
git@gitee.com:byteUUM/concurrent-memory-pool.git
byteUUM
concurrent-memory-pool
ConcurrentMemoryPool
master

搜索帮助