@@ -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
5865void * 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 );
0 commit comments