From cd38ab4fbfa5df241295b4850f1dcce6727ae3d7 Mon Sep 17 00:00:00 2001 From: jacob Date: Sun, 9 Feb 2025 16:25:59 -0600 Subject: [PATCH] another buddy fix --- src/buddy.c | 53 ++++++++++++++++------------------------------------- src/sim.c | 4 ++-- src/user.c | 4 ++++ 3 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/buddy.c b/src/buddy.c index 29ec3684..f1742704 100644 --- a/src/buddy.c +++ b/src/buddy.c @@ -22,7 +22,6 @@ struct buddy_ctx *buddy_ctx_alloc(u64 reserve) level->size = (u64)1 << i; } - return ctx; } @@ -73,18 +72,6 @@ INTERNAL struct buddy_block *buddy_block_get_unused(struct buddy_ctx *ctx, struc { struct buddy_block *block = NULL; - - - - - if (level->tier > 30) { - DEBUGBREAKABLE; - } - - - - - /* TODO: Tier oob check */ if (level->first_unused_block) { block = level->first_unused_block; @@ -94,14 +81,12 @@ INTERNAL struct buddy_block *buddy_block_get_unused(struct buddy_ctx *ctx, struc } block->used = true; block->next = NULL; - ASSERT(block->memory); } else { if (level->backed) { struct buddy_level *parent_level = &ctx->levels[level->tier + 1]; struct buddy_block *parent_block = buddy_block_get_unused(ctx, parent_level); - ASSERT(parent_block->memory); - /* Create left block from parent block */ + /* Create left (used) block from parent block */ struct buddy_block *left = buddy_block_alloc_internal(ctx); left->used = true; left->level = level; @@ -123,45 +108,36 @@ INTERNAL struct buddy_block *buddy_block_get_unused(struct buddy_ctx *ctx, struc left->sibling = right; right->sibling = left; block = left; - ASSERT(block->memory); } else { -#if 1 - /* Create left block from arena */ + struct arena *arena = &ctx->data_arena; + + /* Grow arena */ + i64 level_commit_diff = (level->size * 2) - arena->pos; + if (level_commit_diff > 0) { + arena_push_array(arena, u8, level_commit_diff); + ASSERT(arena->pos == (level->size * 2)); + } + + /* Create left (used) block from existing child block memory */ struct buddy_block *left = buddy_block_alloc_internal(ctx); left->used = true; left->level = level; - left->memory = arena_push_array(&ctx->data_arena, u8, level->size * 2); + left->memory = arena->base; - /* Create right (unused) block from arena */ + /* Create right (unused) block from new arena memory */ struct buddy_block *right = buddy_block_alloc_internal(ctx); right->used = false; right->level = level; right->memory = left->memory + level->size; - if (level->first_unused_block) { - right->next = level->first_unused_block; - level->first_unused_block->prev = right; - } - level->first_unused_block = right; left->sibling = right; right->sibling = left; block = left; level->backed = true; - ASSERT(block->memory); -#else - /* Create block by growing arena */ - block = buddy_block_alloc_internal(ctx); - block->used = true; - block->memory = arena_push_array(&ctx->data_arena, u8, level->size); - block->level = level; - level->backed = true; - ASSERT(block->memory); -#endif } } - ASSERT(block->memory); return block; } @@ -190,8 +166,11 @@ struct buddy_block *buddy_alloc(struct buddy_ctx *ctx, u64 size) { if (size > 0x00FFFFFFFFFFFFFFULL) { /* TODO: Error */ + ASSERT(false); } + /* TODO: Minimum block size */ + u64 desired_block_size = 1; u64 desired_level_tier = 0; while (desired_block_size < size && desired_level_tier < 64) { diff --git a/src/sim.c b/src/sim.c index 16217c81..290d164c 100644 --- a/src/sim.c +++ b/src/sim.c @@ -219,8 +219,8 @@ INTERNAL struct sim_ent *spawn_test_player(struct sim_ctx *ctx) e->layer = SIM_LAYER_RELATIVE_WEAPON; sim_ent_enable_prop(e, SIM_ENT_PROP_WEAPON); - e->trigger_delay = 1.0f / 10.0f; - //e->trigger_delay = 1.0f / 100.0f; + //e->trigger_delay = 1.0f / 10.0f; + e->trigger_delay = 1.0f / 100.0f; player_ent->equipped = e->handle; } diff --git a/src/user.c b/src/user.c index 475e85e4..e2098e63 100644 --- a/src/user.c +++ b/src/user.c @@ -659,6 +659,10 @@ INTERNAL void user_update(void) case SIM_EVENT_KIND_SNAPSHOT: { +#if 0 + u64 oldest_tick = snapshot_store_get_oldest_tick(G.snapshot_store); + u64 newest_tick = snapshot_store_get_newest_tick(G.snapshot_store); +#endif struct string snapshot_data = event->snapshot_data; sim_snapshot_decode(snapshot_data, &G.world, tick); } break;