-
Notifications
You must be signed in to change notification settings - Fork 1
/
ThreadCache.cpp
60 lines (51 loc) · 1.39 KB
/
ThreadCache.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "ThreadCache.h"
#include "CentralCache.h"
void* ThreadCache::FetchFromCentralCache(size_t index, size_t byte)
{
FreeList* freelist = &_freelist[index];
size_t num_to_move = min(ClassSize::NumMoveSize(byte), freelist->MaxSize());
void* start, *end;
size_t fetchnum = CentralCache::GetInstance()->FetchRangeObj(start, end, num_to_move, byte);
if (fetchnum > 1)
freelist->PushRange(NEXT_OBJ(start), end, fetchnum-1);
if (num_to_move == freelist->MaxSize())
{
freelist->SetMaxSize(num_to_move + 1);
}
return start;
}
void* ThreadCache::Allocate(size_t size)
{
assert(size <= MAXBYTES);
// 对齐取整
size = ClassSize::Roundup(size);
size_t index = ClassSize::Index(size);
FreeList* freelist = &_freelist[index];
if (!freelist->Empty())
{
return freelist->Pop();
}
else
{
return FetchFromCentralCache(index, size);
}
}
void ThreadCache::Deallocate(void* ptr, size_t byte)
{
assert(byte <= MAXBYTES);
size_t index = ClassSize::Index(byte);
FreeList* freelist = &_freelist[index];
freelist->Push(ptr);
// 当自由链表对象数量超过一次批量从中心缓存移动的数量时
// 开始回收对象到中心缓存
if (freelist->Size() >= freelist->MaxSize())
{
ListTooLong(freelist, byte);
}
// thread cache总的字节数超过2M,则开始释放
}
void ThreadCache::ListTooLong(FreeList* freelist, size_t byte)
{
void* start = freelist->Clear();
CentralCache::GetInstance()->ReleaseListToSpans(start, byte);
}