Skip to content

Commit 611e769

Browse files
authored
Merge pull request #1 from Icingworld/dev
Review the code
2 parents a593690 + a778b0b commit 611e769

File tree

12 files changed

+706
-302
lines changed

12 files changed

+706
-302
lines changed

memory-pool/include/CentralCache.h

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@
55
namespace WW
66
{
77

8+
constexpr std::size_t MAX_ARRAY_SIZE = 208; // 内存大小数组最大大小
9+
810
/**
911
* @brief 中心缓存
1012
*/
1113
class CentralCache
1214
{
15+
public:
16+
using size_type = std::size_t;
17+
1318
private:
14-
PageCache & page_cache; // 页缓存
15-
std::array<SpanList, 208> spans; // 页段链表数组
19+
PageCache & _Page_cache; // 页缓存
20+
std::array<SpanList, MAX_ARRAY_SIZE> _Spans; // 页段链表数组
1621

1722
private:
1823
CentralCache();
@@ -22,7 +27,7 @@ class CentralCache
2227
CentralCache & operator=(const CentralCache &) = delete;
2328

2429
public:
25-
~CentralCache();
30+
~CentralCache() = default;
2631

2732
public:
2833
/**
@@ -32,30 +37,31 @@ class CentralCache
3237

3338
/**
3439
* @brief 获取指定大小的空闲内存块
35-
* @param index 索引
40+
* @param size 内存块大小
3641
* @param count 个数
37-
* @return 空闲内存块链表
42+
* @return 成功时返回`FreeObject *`,失败时返回`nullptr`
3843
*/
39-
FreeObject * fetchRange(std::size_t index, std::size_t count);
44+
FreeObject * fetchRange(size_type size, size_type count);
4045

4146
/**
4247
* @brief 将空闲内存块归还到中心缓存
4348
* @param index 索引
4449
* @param free_object 空闲内存块链表
4550
*/
46-
void returnRange(std::size_t index, FreeObject * free_object);
51+
void returnRange(size_type size, FreeObject * free_object);
4752

4853
private:
4954
/**
50-
* @brief 索引转换为块大小
55+
* @brief 内存块大小转换为数组索引
5156
*/
52-
std::size_t indexToSize(std::size_t index) const noexcept;
57+
static size_type sizeToIndex(size_type size) noexcept;
5358

5459
/**
5560
* @brief 从自由表中获取一个空闲的页段
5661
* @param index 索引
62+
* @return 成功时返回`Span *`,失败时返回`nullptr`
5763
*/
58-
Span * getFreeSpan(std::size_t index);
64+
Span * getFreeSpan(size_type index);
5965
};
6066

6167
} // namespace WW

memory-pool/include/FreeList.h

Lines changed: 81 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,59 +10,128 @@ namespace WW
1010
*/
1111
class FreeObject
1212
{
13-
public:
14-
FreeObject * next; // 下一个空闲内存块
13+
private:
14+
FreeObject * _Next; // 下一个空闲内存块
1515

1616
public:
1717
FreeObject();
1818

1919
explicit FreeObject(FreeObject * next);
2020

21-
~FreeObject();
21+
~FreeObject() = default;
22+
23+
public:
24+
/**
25+
* @brief 获取下一个空闲内存块
26+
*/
27+
FreeObject * next() const noexcept;
28+
29+
/**
30+
* @brief 设置下一个空闲内存块
31+
*/
32+
void setNext(FreeObject * next) noexcept;
33+
};
34+
35+
/**
36+
* @brief 空闲内存块链表迭代器
37+
*/
38+
class FreeListIterator
39+
{
40+
private:
41+
FreeObject * _Free_object; // 空闲内存块指针
42+
43+
public:
44+
explicit FreeListIterator(FreeObject * free_object) noexcept;
45+
46+
~FreeListIterator() = default;
47+
48+
public:
49+
/**
50+
* @brief 迭代器是否相等
51+
*/
52+
bool operator==(const FreeListIterator & other) const noexcept;
53+
54+
/**
55+
* @brief 迭代器是否不相等
56+
*/
57+
bool operator!=(const FreeListIterator & other) const noexcept;
58+
59+
/**
60+
* @brief 解引用迭代器
61+
* @details 对于内存块,解引用直接返回内存块地址
62+
*/
63+
FreeObject * operator*() noexcept;
64+
65+
/**
66+
* @brief 解引用迭代器
67+
*/
68+
FreeObject * operator->() noexcept;
69+
70+
/**
71+
* @brief 向后移动
72+
*/
73+
FreeListIterator & operator++() noexcept;
74+
75+
/**
76+
* @brief 向后移动
77+
*/
78+
FreeListIterator operator++(int) noexcept;
2279
};
2380

2481
/**
2582
* @brief 空闲内存块链表
83+
* @details 单向链表
2684
*/
2785
class FreeList
2886
{
87+
public:
88+
using size_type = std::size_t; // 内存块数量范围为0-65535,使用uint16_t存储
89+
using iterator = FreeListIterator;
90+
2991
private:
30-
FreeObject * head; // 链表头部,不是虚拟节点
31-
std::size_t freesize; // 空闲内存块数量
92+
FreeObject * _Head; // 虚拟头节点
93+
size_type _Size; // 空闲内存块数量
3294

3395
public:
3496
FreeList();
3597

98+
~FreeList();
99+
36100
public:
37101
/**
38102
* @brief 获取链表头部元素
39103
*/
40-
FreeObject * front() const noexcept;
104+
FreeObject * front() noexcept;
41105

42106
/**
43107
* @brief 将空闲内存块插入到链表头部
44108
*/
45109
void push_front(FreeObject * free_object);
46110

47111
/**
48-
* @brief 从链表头部取出空闲内存块
112+
* @brief 从链表头部移除内存块
49113
*/
50114
void pop_front();
51115

52116
/**
53-
* @brief 链表是否为空
117+
* @brief 获取链表头部
54118
*/
55-
bool empty() const noexcept;
119+
iterator begin() noexcept;
56120

57121
/**
58-
* @brief 清空链表
122+
* @brief 获取链表尾部
59123
*/
60-
void clear();
124+
iterator end() noexcept;
125+
126+
/**
127+
* @brief 链表是否为空
128+
*/
129+
bool empty() const noexcept;
61130

62131
/**
63132
* @brief 获取空闲内存块数量
64133
*/
65-
std::size_t size() const noexcept;
134+
size_type size() const noexcept;
66135
};
67136

68137
} // namespace WW

memory-pool/include/PageCache.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,20 @@
88
namespace WW
99
{
1010

11+
constexpr std::uint8_t MAX_PAGE_COUNT = 128; // 最大页数
12+
1113
/**
1214
* @brief 页缓存
1315
*/
1416
class PageCache
1517
{
18+
public:
19+
using size_type = std::size_t;
20+
1621
private:
17-
std::array<SpanList, 128> spans; // 页段链表数组
18-
std::unordered_map<std::size_t, Span *> span_map; // 页号到页段的映射
19-
std::recursive_mutex mutex; // 页缓存锁
22+
std::array<SpanList, MAX_PAGE_COUNT> _Spans; // 页段链表数组
23+
std::unordered_map<size_type, Span *> _Span_map; // 页号到页段指针的映射
24+
std::recursive_mutex _Mutex; // 页缓存锁
2025

2126
private:
2227
PageCache();
@@ -36,9 +41,10 @@ class PageCache
3641

3742
/**
3843
* @brief 获取指定大小的页段
39-
* @param page_count 页数
44+
* @param count 页数
45+
* @return 成功时返回`Span *`,失败时返回`nullptr`
4046
*/
41-
Span * fetchSpan(std::size_t page_count);
47+
Span * fetchSpan(size_type count);
4248

4349
/**
4450
* @brief 将页段归还到页缓存
@@ -48,14 +54,16 @@ class PageCache
4854

4955
/**
5056
* @brief 通过内存地址找到所属页段
57+
* @param ptr 内存地址
58+
* @return 成功找到返回`Span *`,失败时返回`nullptr`
5159
*/
5260
Span * FreeObjectToSpan(void * ptr);
5361

5462
private:
5563
/**
5664
* @brief 从系统内存中获取指定大小的内存
5765
*/
58-
void * fetchFromSystem(std::size_t page_count) const noexcept;
66+
void * fetchFromSystem(size_type count) const noexcept;
5967
};
6068

6169
} // namespace WW

0 commit comments

Comments
 (0)