another buddy fix
This commit is contained in:
parent
110e28119c
commit
cd38ab4fbf
53
src/buddy.c
53
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) {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user