-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmemoryPool.h
123 lines (108 loc) · 2.17 KB
/
memoryPool.h
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#pragma once
template <class T>
class memoryPool
{
private:
struct memoryBuffer
{
memoryBuffer()
{
next = nullptr;
}
memoryBuffer *next;
T data;
};
struct TOP
{
TOP()
{
tailNode = NULL;
uniqueIndex = 0;
}
memoryBuffer* tailNode;
__int64 uniqueIndex;
};
public:
long usedCount;
long allocCount;
TOP* topNode;
__int64 uniqueIndex;
private:
void clear();
public:
memoryPool();
~memoryPool();
T* Alloc(void);
void Free(T* _data);
long getUsedCount(void) { return usedCount; }
long getAllocCount(void) { return allocCount; }
};
template <class T>
memoryPool<T>::memoryPool()
{
usedCount = 0;
allocCount = 0;
topNode = new TOP;
uniqueIndex = 0;
}
template <class T>
memoryPool<T>::~memoryPool()
{
clear();
delete topNode;
}
template <class T>
void memoryPool<T>::clear()
{
memoryBuffer *node;
node = topNode->tailNode;
while (node)
{
topNode->tailNode = topNode->tailNode->next;
delete node;
node = topNode->tailNode;
InterlockedDecrement(&allocCount);
}
}
template <class T>
T* memoryPool<T>::Alloc(void)
{
memoryBuffer* node = NULL;
TOP dummyTop;
T* returnData = NULL;
InterlockedIncrement(&usedCount);
__int64 unq = InterlockedIncrement64(&uniqueIndex);
if (!topNode->tailNode)
{
alloc:
node = new memoryBuffer();
returnData = &(node->data);
InterlockedIncrement(&allocCount);
}
else
{
do
{
dummyTop.uniqueIndex = topNode->uniqueIndex;
dummyTop.tailNode = topNode->tailNode;
if (!dummyTop.tailNode)
goto alloc;
} while (InterlockedCompareExchange128((long long*)topNode, unq, (long long)dummyTop.tailNode->next, (long long*)&dummyTop)==0);
returnData = &(dummyTop.tailNode->data);
}
return returnData;
}
template <class T>
void memoryPool<T>::Free(T* _data)
{
memoryBuffer* dummyBuffer = (memoryBuffer*)((char*)_data - sizeof(char*));
TOP dummyTop;
__int64 unq = InterlockedIncrement64(&uniqueIndex);
do
{
dummyTop.uniqueIndex = topNode->uniqueIndex;
dummyTop.tailNode = topNode->tailNode;
dummyBuffer->next = dummyTop.tailNode;
} while (InterlockedCompareExchange128((long long*)topNode, unq, (long long)dummyBuffer, (long long*)&dummyTop) == 0);
InterlockedDecrement(&usedCount);
}