Fix memstack not freeing right size block
This commit is contained in:
		
							parent
							
								
									121c630126
								
							
						
					
					
						commit
						7e996981d6
					
				
							
								
								
									
										8
									
								
								dqn.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								dqn.h
									
									
									
									
									
								
							| @ -2918,6 +2918,7 @@ FILE_SCOPE void DqnMemAPIInternal_UpdateAPIStatistics(DqnMemAPI *api, DqnMemAPI: | |||||||
| 	if (request_->type == DqnMemAPI::Type::Free) | 	if (request_->type == DqnMemAPI::Type::Free) | ||||||
| 	{ | 	{ | ||||||
| 		auto *request = &request_->free; | 		auto *request = &request_->free; | ||||||
|  | 		api->bytesAllocated     -= request->sizeToFree; | ||||||
| 		api->lifetimeBytesFreed += request->sizeToFree; | 		api->lifetimeBytesFreed += request->sizeToFree; | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| @ -3140,6 +3141,7 @@ DQN_FILE_SCOPE DqnMemStack::Block *DqnMemStackInternal_AllocateBlock(u32 byteAli | |||||||
| 		return nullptr; | 		return nullptr; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// TODO(doyle): Maybe remove this? and just do 2 allocations, this increases complexity by alot.
 | ||||||
| 	size_t alignedSize = DQN_ALIGN_POW_N(size, byteAlign); | 	size_t alignedSize = DQN_ALIGN_POW_N(size, byteAlign); | ||||||
| 	size_t totalSize   = alignedSize + sizeof(DqnMemStack::Block) + (byteAlign -1); | 	size_t totalSize   = alignedSize + sizeof(DqnMemStack::Block) + (byteAlign -1); | ||||||
| 
 | 
 | ||||||
| @ -3376,7 +3378,11 @@ bool DqnMemStack::FreeMemBlock(DqnMemStack::Block *memBlock) | |||||||
| 	{ | 	{ | ||||||
| 		DqnMemStack::Block *blockToFree = *blockPtr; | 		DqnMemStack::Block *blockToFree = *blockPtr; | ||||||
| 		(*blockPtr)                     = blockToFree->prevBlock; | 		(*blockPtr)                     = blockToFree->prevBlock; | ||||||
| 		this->memAPI->Free(blockToFree, blockToFree->size); | 
 | ||||||
|  | 		// TODO(doyle): Maybe remove this? and just do 2 allocations, this increases complexity by alot.
 | ||||||
|  | 		size_t alignedSize = DQN_ALIGN_POW_N  (blockToFree->size, this->byteAlign); | ||||||
|  | 		size_t realSize = alignedSize + sizeof(DqnMemStack::Block) + (this->byteAlign - 1); | ||||||
|  | 		this->memAPI->Free(blockToFree, realSize); | ||||||
| 
 | 
 | ||||||
| 		// No more blocks, then last block has been freed
 | 		// No more blocks, then last block has been freed
 | ||||||
| 		if (!this->block) DQN_ASSERT(this->tempRegionCount == 0); | 		if (!this->block) DQN_ASSERT(this->tempRegionCount == 0); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user