Revamp memory allocation system

This commit is contained in:
Doyle 2018-09-10 22:49:17 +10:00
parent fd228d092b
commit 650126f039
3 changed files with 1255 additions and 943 deletions

View File

@ -5,7 +5,7 @@ FILE_SCOPE void DqnMemStack_Test()
// Check Alignment // Check Alignment
if (1) if (1)
{ {
auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, 0, DqnMemTracker::Flag::Simple);
i32 const ALIGN64 = 64; i32 const ALIGN64 = 64;
i32 const ALIGN16 = 16; i32 const ALIGN16 = 16;
@ -13,7 +13,7 @@ FILE_SCOPE void DqnMemStack_Test()
DqnMemStack::PushType push_type = DqnMemStack::PushType::Head; DqnMemStack::PushType push_type = DqnMemStack::PushType::Head;
if (1) if (1)
{ {
u8 *result1 = (u8 *)stack.Push(2, push_type, ALIGN4); u8 *result1 = (u8 *)stack.Push_(2, push_type, ALIGN4);
u8 *result2 = (u8 *)DQN_ALIGN_POW_N(result1, ALIGN4); u8 *result2 = (u8 *)DQN_ALIGN_POW_N(result1, ALIGN4);
DQN_ASSERT(result1 == result2); DQN_ASSERT(result1 == result2);
stack.Pop(result1); stack.Pop(result1);
@ -22,7 +22,7 @@ FILE_SCOPE void DqnMemStack_Test()
if (1) if (1)
{ {
u8 *result1 = (u8 *)stack.Push(120, push_type, ALIGN16); u8 *result1 = (u8 *)stack.Push_(120, push_type, ALIGN16);
u8 *result2 = (u8 *)DQN_ALIGN_POW_N(result1, ALIGN16); u8 *result2 = (u8 *)DQN_ALIGN_POW_N(result1, ALIGN16);
DQN_ASSERT(result1 == result2); DQN_ASSERT(result1 == result2);
stack.Pop(result1); stack.Pop(result1);
@ -31,7 +31,7 @@ FILE_SCOPE void DqnMemStack_Test()
if (1) if (1)
{ {
u8 *result1 = (u8 *)stack.Push(12, push_type, ALIGN64); u8 *result1 = (u8 *)stack.Push_(12, push_type, ALIGN64);
u8 *result2 = (u8 *)DQN_ALIGN_POW_N(result1, ALIGN64); u8 *result2 = (u8 *)DQN_ALIGN_POW_N(result1, ALIGN64);
DQN_ASSERT(result1 == result2); DQN_ASSERT(result1 == result2);
stack.Pop(result1); stack.Pop(result1);
@ -46,7 +46,7 @@ FILE_SCOPE void DqnMemStack_Test()
if (1) if (1)
{ {
auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::NonExpandable); auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::NonExpandable);
auto *result1 = stack.Push(DQN_MEGABYTE(2)); auto *result1 = stack.Push_(DQN_MEGABYTE(2));
DQN_ASSERT(result1 == nullptr); DQN_ASSERT(result1 == nullptr);
DQN_ASSERT(stack.block->prev_block == nullptr); DQN_ASSERT(stack.block->prev_block == nullptr);
@ -58,8 +58,6 @@ FILE_SCOPE void DqnMemStack_Test()
if (1) if (1)
{ {
auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes); auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes);
DQN_ASSERT(stack.tracker.bounds_guard_size == 0);
auto *old_block = stack.block; auto *old_block = stack.block;
DQN_ASSERT(old_block); DQN_ASSERT(old_block);
DQN_ASSERT(old_block->size == DQN_MEGABYTE(1)); DQN_ASSERT(old_block->size == DQN_MEGABYTE(1));
@ -67,7 +65,7 @@ FILE_SCOPE void DqnMemStack_Test()
DQN_ASSERT(old_block->tail == old_block->tail); DQN_ASSERT(old_block->tail == old_block->tail);
DQN_ASSERT(old_block->prev_block == nullptr); DQN_ASSERT(old_block->prev_block == nullptr);
auto *result1 = stack.Push(DQN_MEGABYTE(2)); auto *result1 = stack.Push_(DQN_MEGABYTE(2));
DQN_ASSERT(result1); DQN_ASSERT(result1);
DQN_ASSERT(stack.block->prev_block == old_block); DQN_ASSERT(stack.block->prev_block == old_block);
DQN_ASSERT(stack.block != old_block); DQN_ASSERT(stack.block != old_block);
@ -82,24 +80,24 @@ FILE_SCOPE void DqnMemStack_Test()
// Check temporary regions // Check temporary regions
if (1) if (1)
{ {
auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, 0, DqnMemTracker::Flag::Simple);
DqnMemStack::Block *block_to_return_to = stack.block; DqnMemStack::Block *block_to_return_to = stack.block;
auto head_before = block_to_return_to->head; auto head_before = block_to_return_to->head;
auto tail_before = block_to_return_to->tail; auto tail_before = block_to_return_to->tail;
if (1) if (1)
{ {
auto mem_guard1 = stack.MemRegionScope(); auto mem_guard1 = stack.MemRegionScope();
auto *result2 = stack.Push(100); auto *result2 = stack.Push_(100);
auto *result3 = stack.Push(100); auto *result3 = stack.Push_(100);
auto *result4 = stack.Push(100); auto *result4 = stack.Push_(100);
DQN_ASSERT(result2 && result3 && result4); DQN_ASSERT(result2 && result3 && result4);
DQN_ASSERT(stack.block->head != head_before); DQN_ASSERT(stack.block->head != head_before);
DQN_ASSERT(stack.block->tail == tail_before); DQN_ASSERT(stack.block->tail == tail_before);
DQN_ASSERT(stack.block->memory == block_to_return_to->memory); DQN_ASSERT(stack.block->memory == block_to_return_to->memory);
// Force allocation of new block // Force allocation of new block
auto *result5 = stack.Push(DQN_MEGABYTE(5)); auto *result5 = stack.Push_(DQN_MEGABYTE(5));
DQN_ASSERT(result5); DQN_ASSERT(result5);
DQN_ASSERT(stack.block != block_to_return_to); DQN_ASSERT(stack.block != block_to_return_to);
DQN_ASSERT(stack.mem_region_count == 1); DQN_ASSERT(stack.mem_region_count == 1);
@ -115,23 +113,23 @@ FILE_SCOPE void DqnMemStack_Test()
// Check temporary regions keep state // Check temporary regions keep state
if (1) if (1)
{ {
auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, 0, DqnMemTracker::Flag::Simple);
DqnMemStack::Block *block_to_return_to = stack.block; DqnMemStack::Block *block_to_return_to = stack.block;
auto head_before = block_to_return_to->head; auto head_before = block_to_return_to->head;
auto tail_before = block_to_return_to->tail; auto tail_before = block_to_return_to->tail;
if (1) if (1)
{ {
auto mem_guard1 = stack.MemRegionScope(); auto mem_guard1 = stack.MemRegionScope();
auto *result2 = stack.Push(100); auto *result2 = stack.Push_(100);
auto *result3 = stack.Push(100); auto *result3 = stack.Push_(100);
auto *result4 = stack.Push(100); auto *result4 = stack.Push_(100);
DQN_ASSERT(result2 && result3 && result4); DQN_ASSERT(result2 && result3 && result4);
DQN_ASSERT(stack.block->head != head_before); DQN_ASSERT(stack.block->head != head_before);
DQN_ASSERT(stack.block->tail == tail_before); DQN_ASSERT(stack.block->tail == tail_before);
DQN_ASSERT(stack.block->memory == block_to_return_to->memory); DQN_ASSERT(stack.block->memory == block_to_return_to->memory);
// Force allocation of new block // Force allocation of new block
auto *result5 = stack.Push(DQN_MEGABYTE(5)); auto *result5 = stack.Push_(DQN_MEGABYTE(5));
DQN_ASSERT(result5); DQN_ASSERT(result5);
DQN_ASSERT(stack.block != block_to_return_to); DQN_ASSERT(stack.block != block_to_return_to);
DQN_ASSERT(stack.mem_region_count == 1); DQN_ASSERT(stack.mem_region_count == 1);
@ -148,10 +146,10 @@ FILE_SCOPE void DqnMemStack_Test()
// Check temporary regions with tail and head pushes // Check temporary regions with tail and head pushes
if (1) if (1)
{ {
auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, 0, DqnMemTracker::Flag::Simple);
auto *pop1 = stack.Push(222); auto *pop1 = stack.Push_(222);
auto *pop2 = stack.Push(333, DqnMemStack::PushType::Tail); auto *pop2 = stack.Push_(333, DqnMemStack::PushType::Tail);
DqnMemStack::Block *block_to_return_to = stack.block; DqnMemStack::Block *block_to_return_to = stack.block;
auto head_before = block_to_return_to->head; auto head_before = block_to_return_to->head;
@ -159,10 +157,10 @@ FILE_SCOPE void DqnMemStack_Test()
if (1) if (1)
{ {
auto mem_guard1 = stack.MemRegionScope(); auto mem_guard1 = stack.MemRegionScope();
auto *result2 = stack.Push(100); auto *result2 = stack.Push_(100);
auto *result3 = stack.Push(100, DqnMemStack::PushType::Tail); auto *result3 = stack.Push_(100, DqnMemStack::PushType::Tail);
auto *result4 = stack.Push(100); auto *result4 = stack.Push_(100);
auto *result5 = stack.Push(100, DqnMemStack::PushType::Tail); auto *result5 = stack.Push_(100, DqnMemStack::PushType::Tail);
DQN_ASSERT(result2 && result3 && result4 && result5); DQN_ASSERT(result2 && result3 && result4 && result5);
DQN_ASSERT(result3 > result5); DQN_ASSERT(result3 > result5);
DQN_ASSERT(result2 < result4); DQN_ASSERT(result2 < result4);
@ -171,7 +169,7 @@ FILE_SCOPE void DqnMemStack_Test()
DQN_ASSERT(stack.block->memory == block_to_return_to->memory); DQN_ASSERT(stack.block->memory == block_to_return_to->memory);
// Force allocation of new block // Force allocation of new block
auto *result6 = stack.Push(DQN_MEGABYTE(5)); auto *result6 = stack.Push_(DQN_MEGABYTE(5));
DQN_ASSERT(result6); DQN_ASSERT(result6);
DQN_ASSERT(stack.block != block_to_return_to); DQN_ASSERT(stack.block != block_to_return_to);
DQN_ASSERT(stack.mem_region_count == 1); DQN_ASSERT(stack.mem_region_count == 1);
@ -206,11 +204,11 @@ FILE_SCOPE void DqnMemStack_Test()
DQN_ASSERT(stack.mem_region_count == 0); DQN_ASSERT(stack.mem_region_count == 0);
DQN_ASSERT(stack.flags == DqnMemStack::Flag::NonExpandable); DQN_ASSERT(stack.flags == DqnMemStack::Flag::NonExpandable);
auto *result1 = stack.Push(32); auto *result1 = stack.Push_(32);
DQN_ASSERT(result1); DQN_ASSERT(result1);
stack.Pop(result1); stack.Pop(result1);
auto *result2 = stack.Push(buf_size * 2); auto *result2 = stack.Push_(buf_size * 2);
DQN_ASSERT(result2 == nullptr); DQN_ASSERT(result2 == nullptr);
DQN_ASSERT(stack.block); DQN_ASSERT(stack.block);
DQN_ASSERT(stack.block->prev_block == false); DQN_ASSERT(stack.block->prev_block == false);
@ -233,19 +231,19 @@ FILE_SCOPE void DqnMemStack_Test()
auto *block1 = stack.block; auto *block1 = stack.block;
size += additional_size; size += additional_size;
auto *result1 = stack.Push(size); auto *result1 = stack.Push_(size);
auto *block2 = stack.block; auto *block2 = stack.block;
size += additional_size; size += additional_size;
auto *result2 = stack.Push(size); auto *result2 = stack.Push_(size);
auto *block3 = stack.block; auto *block3 = stack.block;
size += additional_size; size += additional_size;
auto *result3 = stack.Push(size); auto *result3 = stack.Push_(size);
auto *block4 = stack.block; auto *block4 = stack.block;
size += additional_size; size += additional_size;
auto *result4 = stack.Push(size); auto *result4 = stack.Push_(size);
auto *block5 = stack.block; auto *block5 = stack.block;
DQN_ASSERT(result1 && result2 && result3 && result4); DQN_ASSERT(result1 && result2 && result3 && result4);
@ -277,8 +275,8 @@ FILE_SCOPE void DqnMemStack_Test()
// Check bounds guard places magic values // Check bounds guard places magic values
if (1) if (1)
{ {
auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, 0, DqnMemTracker::Flag::Simple);
char *result = static_cast<char *>(stack.Push(64)); char *result = static_cast<char *>(stack.Push_(64));
// TODO(doyle): check head and tail are adjacent to the bounds of the allocation // TODO(doyle): check head and tail are adjacent to the bounds of the allocation
u32 *head = stack.tracker.PtrToHeadGuard(result); u32 *head = stack.tracker.PtrToHeadGuard(result);
@ -292,13 +290,13 @@ FILE_SCOPE void DqnMemStack_Test()
if (1) if (1)
{ {
// Push to tail and head // Push_ to tail and head
if (1) if (1)
{ {
DqnMemStack stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); DqnMemStack stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, 0, DqnMemTracker::Flag::Simple);
auto *result1 = stack.Push(100); auto *result1 = stack.Push_(100);
auto *result2 = stack.Push(100, DqnMemStack::PushType::Tail); auto *result2 = stack.Push_(100, DqnMemStack::PushType::Tail);
auto *head_before = stack.block->head; auto *head_before = stack.block->head;
auto *tail_before = stack.block->tail; auto *tail_before = stack.block->tail;
DQN_ASSERT(result2 && result1); DQN_ASSERT(result2 && result1);
@ -313,24 +311,24 @@ FILE_SCOPE void DqnMemStack_Test()
DQN_ASSERT(stack.block->head == stack.block->memory); DQN_ASSERT(stack.block->head == stack.block->memory);
DQN_ASSERT(stack.block->tail == stack.block->memory + stack.block->size); DQN_ASSERT(stack.block->tail == stack.block->memory + stack.block->size);
stack.Free(); stack.Free();
Log(Status::Ok, "Push, pop to tail and head."); Log(Status::Ok, "Push_, pop to tail and head.");
} }
// Expansion with tail // Expansion with tail
if (1) if (1)
{ {
// Push too much to tail causes expansion // Push_ too much to tail causes expansion
if (1) if (1)
{ {
DqnMemStack stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); DqnMemStack stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, 0, DqnMemTracker::Flag::Simple);
auto *result1 = stack.Push(100); auto *result1 = stack.Push_(100);
DQN_ASSERT(stack.block->prev_block == nullptr); DQN_ASSERT(stack.block->prev_block == nullptr);
DQN_ASSERT(stack.block->head > stack.block->memory && stack.block->head < stack.block->tail); DQN_ASSERT(stack.block->head > stack.block->memory && stack.block->head < stack.block->tail);
DQN_ASSERT(stack.block->tail == stack.block->memory + stack.block->size); DQN_ASSERT(stack.block->tail == stack.block->memory + stack.block->size);
auto *block_before = stack.block; auto *block_before = stack.block;
auto *result2 = stack.Push(DQN_MEGABYTE(1), DqnMemStack::PushType::Tail); auto *result2 = stack.Push_(DQN_MEGABYTE(1), DqnMemStack::PushType::Tail);
DQN_ASSERT(result2 && result1); DQN_ASSERT(result2 && result1);
DQN_ASSERT(result2 != result1); DQN_ASSERT(result2 != result1);
DQN_ASSERT(stack.block->prev_block == block_before); DQN_ASSERT(stack.block->prev_block == block_before);
@ -349,18 +347,18 @@ FILE_SCOPE void DqnMemStack_Test()
stack.Free(); stack.Free();
} }
// Push too much to tail fails to expand when non expandable // Push_ too much to tail fails to expand when non expandable
if (1) if (1)
{ {
DqnMemStack stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::NonExpandable); DqnMemStack stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::NonExpandable);
auto *result1 = stack.Push(100); auto *result1 = stack.Push_(100);
DQN_ASSERT(stack.block->prev_block == nullptr); DQN_ASSERT(stack.block->prev_block == nullptr);
DQN_ASSERT(stack.block->head != stack.block->memory); DQN_ASSERT(stack.block->head != stack.block->memory);
DQN_ASSERT(stack.block->tail == stack.block->memory + stack.block->size); DQN_ASSERT(stack.block->tail == stack.block->memory + stack.block->size);
auto *block_before = stack.block; auto *block_before = stack.block;
auto *result2 = stack.Push(DQN_MEGABYTE(1), DqnMemStack::PushType::Tail); auto *result2 = stack.Push_(DQN_MEGABYTE(1), DqnMemStack::PushType::Tail);
DQN_ASSERT(result2 == nullptr); DQN_ASSERT(result2 == nullptr);
DQN_ASSERT(stack.block->prev_block == nullptr); DQN_ASSERT(stack.block->prev_block == nullptr);
DQN_ASSERT(stack.block == block_before); DQN_ASSERT(stack.block == block_before);
@ -397,7 +395,7 @@ FILE_SCOPE void DqnMemStack_Test()
auto *head_before = stack.block->head; auto *head_before = stack.block->head;
isize buf_size = 16; isize buf_size = 16;
char *buf = (char *)stack.Push(buf_size); char *buf = (char *)stack.Push_(buf_size);
DqnMem_Set(buf, 'X', buf_size); DqnMem_Set(buf, 'X', buf_size);
for (auto i = 0; i < buf_size; i++) DQN_ASSERT(buf[i] == 'X'); for (auto i = 0; i < buf_size; i++) DQN_ASSERT(buf[i] == 'X');
@ -427,7 +425,7 @@ FILE_SCOPE void DqnMemStack_Test()
auto *tail_before = stack.block->tail; auto *tail_before = stack.block->tail;
isize buf_size = 16; isize buf_size = 16;
char *buf = (char *)stack.Push(buf_size, DqnMemStack::PushType::Tail); char *buf = (char *)stack.Push_(buf_size, DqnMemStack::PushType::Tail);
DqnMem_Set(buf, 'X', buf_size); DqnMem_Set(buf, 'X', buf_size);
for (auto i = 0; i < buf_size; i++) DQN_ASSERT(buf[i] == 'X'); for (auto i = 0; i < buf_size; i++) DQN_ASSERT(buf[i] == 'X');
@ -462,7 +460,7 @@ FILE_SCOPE void DqnMemStack_Test()
auto *head_before = stack.block->head; auto *head_before = stack.block->head;
isize buf_size = 16; isize buf_size = 16;
char *buf = (char *)stack.Push(buf_size); char *buf = (char *)stack.Push_(buf_size);
DqnMem_Set(buf, 'X', buf_size); DqnMem_Set(buf, 'X', buf_size);
for (auto i = 0; i < buf_size; i++) DQN_ASSERT(buf[i] == 'X'); for (auto i = 0; i < buf_size; i++) DQN_ASSERT(buf[i] == 'X');
@ -491,7 +489,7 @@ FILE_SCOPE void DqnMemStack_Test()
auto *tail_before = stack.block->tail; auto *tail_before = stack.block->tail;
isize buf_size = 16; isize buf_size = 16;
char *buf = (char *)stack.Push(buf_size, DqnMemStack::PushType::Tail); char *buf = (char *)stack.Push_(buf_size, DqnMemStack::PushType::Tail);
DqnMem_Set(buf, 'X', buf_size); DqnMem_Set(buf, 'X', buf_size);
for (auto i = 0; i < buf_size; i++) DQN_ASSERT(buf[i] == 'X'); for (auto i = 0; i < buf_size; i++) DQN_ASSERT(buf[i] == 'X');

View File

@ -1299,7 +1299,7 @@ void DqnArray_Test()
if (1) if (1)
{ {
auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); auto stack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, 0, DqnMemTracker::Flag::Simple);
DQN_DEFER { stack.Free(); }; DQN_DEFER { stack.Free(); };
#if 0 #if 0
if (1) if (1)
@ -1436,7 +1436,7 @@ void DqnFile_Test()
file->Close(); file->Close();
} }
auto memstack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); auto memstack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemTracker::Flag::Simple);
// Read data back in // Read data back in
for (u32 i = 0; i < DQN_ARRAY_COUNT(file_names); i++) for (u32 i = 0; i < DQN_ARRAY_COUNT(file_names); i++)
{ {
@ -1447,7 +1447,7 @@ void DqnFile_Test()
bool result = file->Open(file_names[i], permissions, DqnFile::Action::OpenOnly); bool result = file->Open(file_names[i], permissions, DqnFile::Action::OpenOnly);
DQN_ASSERT(result); DQN_ASSERT(result);
u8 *buffer = (u8 *)memstack.Push(file->size); u8 *buffer = (u8 *)memstack.Push_(file->size);
DQN_ASSERT(buffer); DQN_ASSERT(buffer);
size_t bytesRead = file->Read(buffer, file->size); size_t bytesRead = file->Read(buffer, file->size);
@ -1466,7 +1466,7 @@ void DqnFile_Test()
size_t reqSize = 0; size_t reqSize = 0;
DQN_ASSERT(DqnFile_Size(file_names[i], &reqSize)); DQN_ASSERT(DqnFile_Size(file_names[i], &reqSize));
u8 *buffer = (u8 *)memstack.Push(reqSize); u8 *buffer = (u8 *)memstack.Push_(reqSize);
DQN_ASSERT(buffer); DQN_ASSERT(buffer);
DQN_ASSERT(DqnFile_ReadAll(file_names[i], buffer, reqSize)); DQN_ASSERT(DqnFile_ReadAll(file_names[i], buffer, reqSize));
@ -1572,7 +1572,7 @@ FILE_SCOPE void DqnJobQueue_Test()
LOG_HEADER(); LOG_HEADER();
global_debug_counter = 0; global_debug_counter = 0;
auto memstack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); auto memstack = DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroMem::Yes, 0, DqnMemTracker::Flag::Simple);
u32 num_threads, num_cores; u32 num_threads, num_cores;
DqnOS_GetThreadsAndCores(&num_cores, &num_threads); DqnOS_GetThreadsAndCores(&num_cores, &num_threads);
@ -1582,7 +1582,7 @@ FILE_SCOPE void DqnJobQueue_Test()
if (total_threads == 0) total_threads = 1; if (total_threads == 0) total_threads = 1;
DqnJobQueue job_queue = {}; DqnJobQueue job_queue = {};
DqnJob *job_list = (DqnJob *)memstack.Push(sizeof(*job_queue.job_list) * QUEUE_SIZE); DqnJob *job_list = (DqnJob *)memstack.Push_(sizeof(*job_queue.job_list) * QUEUE_SIZE);
DQN_ASSERT(DqnJobQueue_Init(&job_queue, job_list, QUEUE_SIZE, total_threads)); DQN_ASSERT(DqnJobQueue_Init(&job_queue, job_list, QUEUE_SIZE, total_threads));
const u32 WORK_ENTRIES = 2048; const u32 WORK_ENTRIES = 2048;
@ -1616,13 +1616,13 @@ void DqnQuickSort_Test()
auto state = DqnRndPCG(); auto state = DqnRndPCG();
if (1) if (1)
{ {
auto stack = DqnMemStack(DQN_KILOBYTE(1), Dqn::ZeroMem::Yes, DqnMemStack::Flag::BoundsGuard); auto stack = DqnMemStack(DQN_KILOBYTE(1), Dqn::ZeroMem::Yes, 0, DqnMemTracker::Flag::Simple);
// Create array of ints // Create array of ints
u32 num_ints = 1000000; u32 num_ints = 1000000;
u32 size_in_bytes = sizeof(u32) * num_ints; u32 size_in_bytes = sizeof(u32) * num_ints;
u32 *dqn_cpp_array = (u32 *)stack.Push(size_in_bytes); u32 *dqn_cpp_array = (u32 *)stack.Push_(size_in_bytes);
u32 *std_array = (u32 *)stack.Push(size_in_bytes); u32 *std_array = (u32 *)stack.Push_(size_in_bytes);
DQN_ASSERT(dqn_cpp_array && std_array); DQN_ASSERT(dqn_cpp_array && std_array);
f64 dqn_cpp_timings[2] = {}; f64 dqn_cpp_timings[2] = {};

2078
dqn.h

File diff suppressed because it is too large Load Diff