dqn: Fix block metadata size free error
This commit is contained in:
parent
546f1a079c
commit
faa46b4921
18
dqn.h
18
dqn.h
@ -6322,6 +6322,10 @@ struct Dqn_ArenaBlockResetInfo_
|
|||||||
Dqn_usize used_value;
|
Dqn_usize used_value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Calculate the size in bytes required to allocate the memory for the block
|
||||||
|
// (*not* including the memory required for the user in the block!)
|
||||||
|
#define Dqn_Arena_BlockMetadataSize_(arena) ((arena)->use_after_free_guard ? (Dqn_PowerOfTwoAlign(sizeof(Dqn_ArenaBlock), DQN_VMEM_PAGE_GRANULARITY)) : sizeof(Dqn_ArenaBlock))
|
||||||
|
|
||||||
DQN_API void Dqn_Arena_BlockReset_(DQN_LEAK_TRACE_FUNCTION Dqn_ArenaBlock *block, Dqn_ZeroMem zero_mem, Dqn_ArenaBlockResetInfo_ reset_info)
|
DQN_API void Dqn_Arena_BlockReset_(DQN_LEAK_TRACE_FUNCTION Dqn_ArenaBlock *block, Dqn_ZeroMem zero_mem, Dqn_ArenaBlockResetInfo_ reset_info)
|
||||||
{
|
{
|
||||||
if (!block)
|
if (!block)
|
||||||
@ -6331,7 +6335,8 @@ DQN_API void Dqn_Arena_BlockReset_(DQN_LEAK_TRACE_FUNCTION Dqn_ArenaBlock *block
|
|||||||
DQN_MEMSET(block->memory, DQN_MEMSET_BYTE, block->commit);
|
DQN_MEMSET(block->memory, DQN_MEMSET_BYTE, block->commit);
|
||||||
|
|
||||||
if (reset_info.free_memory) {
|
if (reset_info.free_memory) {
|
||||||
Dqn_VMem_Release(block, sizeof(*block) + block->size);
|
Dqn_usize block_metadata_size = Dqn_Arena_BlockMetadataSize_(block->arena);
|
||||||
|
Dqn_VMem_Release(block, block_metadata_size + block->size);
|
||||||
Dqn_Library_LeakTraceMarkFree(DQN_LEAK_TRACE_ARG block);
|
Dqn_Library_LeakTraceMarkFree(DQN_LEAK_TRACE_ARG block);
|
||||||
} else {
|
} else {
|
||||||
block->used = reset_info.used_value;
|
block->used = reset_info.used_value;
|
||||||
@ -6478,13 +6483,10 @@ DQN_API Dqn_ArenaBlock *Dqn_Arena_Grow_(DQN_LEAK_TRACE_FUNCTION Dqn_Arena *arena
|
|||||||
if (!arena || size == 0)
|
if (!arena || size == 0)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
Dqn_usize block_metadata_size = sizeof(Dqn_ArenaBlock);
|
Dqn_usize block_metadata_size = Dqn_Arena_BlockMetadataSize_(arena);
|
||||||
if (arena->use_after_free_guard)
|
commit = DQN_MIN(commit, size);
|
||||||
block_metadata_size = Dqn_PowerOfTwoAlign(block_metadata_size, DQN_VMEM_PAGE_GRANULARITY);
|
Dqn_usize reserve_aligned = Dqn_PowerOfTwoAlign(size + block_metadata_size, DQN_VMEM_RESERVE_GRANULARITY);
|
||||||
|
Dqn_usize commit_aligned = Dqn_PowerOfTwoAlign(commit + block_metadata_size, DQN_VMEM_COMMIT_GRANULARITY);
|
||||||
commit = DQN_MIN(commit, size);
|
|
||||||
Dqn_usize reserve_aligned = Dqn_PowerOfTwoAlign(size + block_metadata_size, DQN_VMEM_RESERVE_GRANULARITY);
|
|
||||||
Dqn_usize commit_aligned = Dqn_PowerOfTwoAlign(commit + block_metadata_size, DQN_VMEM_COMMIT_GRANULARITY);
|
|
||||||
DQN_ASSERT(commit_aligned < reserve_aligned);
|
DQN_ASSERT(commit_aligned < reserve_aligned);
|
||||||
|
|
||||||
// NOTE: If the commit amount is the same as reserve size we can save one
|
// NOTE: If the commit amount is the same as reserve size we can save one
|
||||||
|
Loading…
Reference in New Issue
Block a user