void* b = ConcurrentAlloc((size_t)257 * 1024);
void *a=ConcurrentAlloc(1);
ConcurrentFree(b);
ConcurrentFree(a);
只创建了一个线程,由于第一次已经超限,所以第二次无法分配
void *a=ConcurrentAlloc(1);
void* b = ConcurrentAlloc((size_t)257 * 1024);
ConcurrentFree(a);
ConcurrentFree(b);
可以看到线程只有一个,由于创建的线程首先分配了1的内存 ,大内存虽然申请了下来,却无法释放
void* b = ConcurrentAlloc((size_t)257 * 1024);
ConcurrentFree(b);
但是大内存其实根本没有申请出来
static void ConcurrentFree(void* ptr)
{
span* span1 = Pagecache::GetInstance()->MapObjectToSpan(ptr);
size_t size = span1->objsize;
cout << size << endl;
if (size > Maxbyte)
{
span* span1 = Pagecache::GetInstance()->MapObjectToSpan(ptr);
Pagecache::GetInstance()->_pageMtx.lock();
Pagecache::GetInstance()->relisttopagecache(span1);
Pagecache::GetInstance()->_pageMtx.unlock();
cout << "大内存释放" << endl;
}
else
{
cout << pTLSThreadCache <<"释放" << endl;
pTLSThreadCache->deletefreelist(ptr, size);
}
}
一点内存没给
但是span1也不为空
来一步步检查程序是否正常工作
找到问题了,newspan没进去
递归调用一次
可以发现,申请了128页的内存
进入了普通线程拿内存的逻辑
原因找到了,Maxbyte是32页,就要进入堆分配逻辑,但是Npages-1是128页,导致要进入堆的内存大小远远小于进入堆分配逻辑的要求大小
将页数修改一下
仍然不行,因为修改这一项会影响中心缓存的逻辑,如果它要申请70页的内存,直接给堆了,不合理,所以只能改回来
页缓存没有问题,也就是申请没有问题,看看释放的问题,我们会发现size=0,所以无法进入大内存释放逻辑,所以应该赋值一下span->objsize
但是,边缘情况失败
对比报错分界点121
与线程内存无关,仅仅是无法处理121字节以上的内存
继续示踪,发现是FetchRangeObj,
GetOneSpan的问题
while (start < end)
{
Nextobj(tail) = start;
tail = Nextobj(tail);
start += size;
}
问题来自这个
bytes有问题,从下到上找
span1->n = size;
我的天哪,这个应该是页数啊,是不是按字节算了
调试完成