diff --git a/src/arena.c b/src/arena.c index d64b8cdd..b90b6ab9 100644 --- a/src/arena.c +++ b/src/arena.c @@ -119,16 +119,16 @@ void arena_decommit_unused_blocks(struct arena *arena) void arena_set_readonly(struct arena *arena) { - sys_memory_set_committed_readonly(arena->base, arena->committed); #if RTC arena->readonly = true; #endif + sys_memory_set_committed_readonly(arena->base, arena->committed); } void arena_set_readwrite(struct arena *arena) { + sys_memory_set_committed_readwrite(arena->base, arena->committed); #if RTC arena->readonly = false; #endif - sys_memory_set_committed_readwrite(arena->base, arena->committed); } diff --git a/src/game.c b/src/game.c index b017d7e6..f5d94a52 100644 --- a/src/game.c +++ b/src/game.c @@ -15,6 +15,8 @@ GLOBAL struct { struct atomic_i32 game_thread_shutdown; struct sys_thread game_thread; + /* Double buffered game state */ + struct world prev_world; /* Last tick */ struct world world; /* Game thread input */ @@ -51,6 +53,7 @@ struct game_startup_receipt game_startup(struct mixer_startup_receipt *mixer_sr, /* Initialize tick transmission */ world_alloc(&G.published_tick); + arena_set_readonly(&G.published_tick.entity_store->arena); G.published_tick_mutex = sys_mutex_alloc(); G.world.timescale = GAME_TIMESCALE; @@ -132,7 +135,7 @@ INTERNAL void spawn_test_entities(void) /* Child 1 */ { - struct v2 pos = V2(0.25, -0.25); + struct v2 pos = V2(1, 0); struct v2 size = V2(1, 1); f32 r = PI / 4; @@ -172,7 +175,11 @@ INTERNAL void publish_game_tick(void) { __prof; struct sys_lock lock = sys_mutex_lock_e(&G.published_tick_mutex); - world_copy_replace(&G.published_tick, &G.world); + arena_set_readwrite(&G.published_tick.entity_store->arena); + { + world_copy_replace(&G.published_tick, &G.world); + } + arena_set_readonly(&G.published_tick.entity_store->arena); atomic_u64_eval_exchange(&G.published_tick_id, G.published_tick.tick_id); sys_mutex_unlock(&lock); } diff --git a/src/sys.h b/src/sys.h index 2840a843..6bbf1777 100644 --- a/src/sys.h +++ b/src/sys.h @@ -167,7 +167,10 @@ void *sys_memory_commit(void *address, u64 size); * address space) */ void sys_memory_decommit(void *address, u64 size); +/* Mark committed pages as readonly */ void sys_memory_set_committed_readonly(void *address, u64 size); + +/* Mark committed pages as readable & writeable (default for committed memory) */ void sys_memory_set_committed_readwrite(void *address, u64 size); /* ========================== *