Skip to content

Commit e99ef69

Browse files
Merge pull request #6 from DevShiftTeam/development
More convenient way to allocate new blocks without affecting performance
2 parents 3bd21e7 + 2be5292 commit e99ef69

2 files changed

Lines changed: 20 additions & 33 deletions

File tree

MemoryPool.cpp

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,15 @@ CPPShift::Memory::MemoryPool* CPPShift::Memory::MemoryPoolManager::create(size_t
2828
if (mp == NULL) throw EMemoryErrors::CANNOT_CREATE_MEMORY_POOL;
2929

3030
// Add first block to memory pool
31-
mp->firstBlock = createMemoryBlock(block_size);
32-
mp->firstBlock->mp_container = mp;
33-
mp->currentBlock = mp->firstBlock;
31+
mp->firstBlock = mp->currentBlock = nullptr;
3432
mp->defaultBlockSize = block_size;
3533
mp->currentScope = nullptr;
34+
createMemoryBlock(mp, block_size);
3635

3736
return mp;
3837
}
3938

40-
CPPShift::Memory::SMemoryBlockHeader* CPPShift::Memory::MemoryPoolManager::createMemoryBlock(size_t block_size)
39+
void CPPShift::Memory::MemoryPoolManager::createMemoryBlock(MemoryPool* mp, size_t block_size)
4140
{
4241
// Create the block
4342
SMemoryBlockHeader* block = reinterpret_cast<SMemoryBlockHeader*>(std::malloc(sizeof(SMemoryBlockHeader) + block_size));
@@ -46,13 +45,21 @@ CPPShift::Memory::SMemoryBlockHeader* CPPShift::Memory::MemoryPoolManager::creat
4645
// Initalize block data
4746
block->blockSize = block_size;
4847
block->offset = 0;
49-
block->mp_container = nullptr;
50-
block->next = nullptr;
51-
block->prev = nullptr;
48+
block->mp_container = mp;
5249
block->numberOfAllocated = 0;
5350
block->numberOfDeleted = 0;
5451

55-
return block;
52+
if (mp->firstBlock != nullptr) {
53+
block->next = nullptr;
54+
block->prev = mp->currentBlock;
55+
mp->currentBlock->next = block;
56+
mp->currentBlock = block;
57+
}
58+
else {
59+
block->next = block->prev = nullptr;
60+
mp->firstBlock = block;
61+
mp->currentBlock = block;
62+
}
5663
}
5764

5865
void* CPPShift::Memory::MemoryPoolManager::allocate(MemoryPool* mp, size_t size)
@@ -62,18 +69,8 @@ void* CPPShift::Memory::MemoryPoolManager::allocate(MemoryPool* mp, size_t size)
6269
// If there is enough space in current block then use the current block
6370
if (size + sizeof(SMemoryUnitHeader) < mp->currentBlock->blockSize - mp->currentBlock->offset);
6471
// Create new block if not enough space
65-
else if (size + sizeof(SMemoryUnitHeader) >= mp->defaultBlockSize) {
66-
mp->currentBlock->next = createMemoryBlock(size + sizeof(SMemoryUnitHeader));
67-
mp->currentBlock->next->mp_container = mp;
68-
mp->currentBlock->next->prev = mp->currentBlock;
69-
mp->currentBlock = mp->currentBlock->next;
70-
}
71-
else {
72-
mp->currentBlock->next = createMemoryBlock(mp->defaultBlockSize);
73-
mp->currentBlock->next->mp_container = mp;
74-
mp->currentBlock->next->prev = mp->currentBlock;
75-
mp->currentBlock = mp->currentBlock->next;
76-
}
72+
else if (size + sizeof(SMemoryUnitHeader) >= mp->defaultBlockSize) createMemoryBlock(mp, size + sizeof(SMemoryUnitHeader));
73+
else createMemoryBlock(mp, mp->defaultBlockSize);
7774

7875
// Add unit
7976
SMemoryUnitHeader* unit = reinterpret_cast<SMemoryUnitHeader*>(reinterpret_cast<char*>(mp->currentBlock) + sizeof(SMemoryBlockHeader) + mp->currentBlock->offset);
@@ -90,18 +87,8 @@ void* CPPShift::Memory::MemoryPoolManager::allocate_unsafe(MemoryPool* mp, size_
9087
// If there is enough space in current block then use the current block
9188
if (size + sizeof(SMemoryUnitHeader) < mp->currentBlock->blockSize - mp->currentBlock->offset);
9289
// Create new block if not enough space
93-
else if (size + sizeof(SMemoryUnitHeader) >= mp->defaultBlockSize) {
94-
mp->currentBlock->next = createMemoryBlock(size + sizeof(SMemoryUnitHeader));
95-
mp->currentBlock->next->mp_container = mp;
96-
mp->currentBlock->next->prev = mp->currentBlock;
97-
mp->currentBlock = mp->currentBlock->next;
98-
}
99-
else {
100-
mp->currentBlock->next = createMemoryBlock(mp->defaultBlockSize);
101-
mp->currentBlock->next->mp_container = mp;
102-
mp->currentBlock->next->prev = mp->currentBlock;
103-
mp->currentBlock = mp->currentBlock->next;
104-
}
90+
else if (size + sizeof(SMemoryUnitHeader) >= mp->defaultBlockSize) createMemoryBlock(mp, size + sizeof(SMemoryUnitHeader));
91+
else createMemoryBlock(mp, mp->defaultBlockSize);
10592

10693
// Add unit
10794
SMemoryUnitHeader* unit = reinterpret_cast<SMemoryUnitHeader*>(reinterpret_cast<char*>(mp->currentBlock) + sizeof(SMemoryBlockHeader) + mp->currentBlock->offset);

MemoryPool.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ namespace CPPShift::Memory {
4343
*
4444
* @returns SMemoryBlockHeader* Pointer to the header of the memory block
4545
*/
46-
static SMemoryBlockHeader* createMemoryBlock(size_t block_size = MEMORYPOOL_DEFAULT_BLOCK_SIZE);
46+
static void createMemoryBlock(MemoryPool* mp, size_t block_size = MEMORYPOOL_DEFAULT_BLOCK_SIZE);
4747

4848
/**
4949
* Allocates memory in a pool

0 commit comments

Comments
 (0)