mark published tick entity store read only

This commit is contained in:
jacob 2024-08-12 15:18:51 -05:00
parent 192d5db2a5
commit 787bb9e0d1
3 changed files with 14 additions and 4 deletions

View File

@ -119,16 +119,16 @@ void arena_decommit_unused_blocks(struct arena *arena)
void arena_set_readonly(struct arena *arena) void arena_set_readonly(struct arena *arena)
{ {
sys_memory_set_committed_readonly(arena->base, arena->committed);
#if RTC #if RTC
arena->readonly = true; arena->readonly = true;
#endif #endif
sys_memory_set_committed_readonly(arena->base, arena->committed);
} }
void arena_set_readwrite(struct arena *arena) void arena_set_readwrite(struct arena *arena)
{ {
sys_memory_set_committed_readwrite(arena->base, arena->committed);
#if RTC #if RTC
arena->readonly = false; arena->readonly = false;
#endif #endif
sys_memory_set_committed_readwrite(arena->base, arena->committed);
} }

View File

@ -15,6 +15,8 @@ GLOBAL struct {
struct atomic_i32 game_thread_shutdown; struct atomic_i32 game_thread_shutdown;
struct sys_thread game_thread; struct sys_thread game_thread;
/* Double buffered game state */
struct world prev_world; /* Last tick */
struct world world; struct world world;
/* Game thread input */ /* Game thread input */
@ -51,6 +53,7 @@ struct game_startup_receipt game_startup(struct mixer_startup_receipt *mixer_sr,
/* Initialize tick transmission */ /* Initialize tick transmission */
world_alloc(&G.published_tick); world_alloc(&G.published_tick);
arena_set_readonly(&G.published_tick.entity_store->arena);
G.published_tick_mutex = sys_mutex_alloc(); G.published_tick_mutex = sys_mutex_alloc();
G.world.timescale = GAME_TIMESCALE; G.world.timescale = GAME_TIMESCALE;
@ -132,7 +135,7 @@ INTERNAL void spawn_test_entities(void)
/* Child 1 */ /* Child 1 */
{ {
struct v2 pos = V2(0.25, -0.25); struct v2 pos = V2(1, 0);
struct v2 size = V2(1, 1); struct v2 size = V2(1, 1);
f32 r = PI / 4; f32 r = PI / 4;
@ -172,7 +175,11 @@ INTERNAL void publish_game_tick(void)
{ {
__prof; __prof;
struct sys_lock lock = sys_mutex_lock_e(&G.published_tick_mutex); struct sys_lock lock = sys_mutex_lock_e(&G.published_tick_mutex);
arena_set_readwrite(&G.published_tick.entity_store->arena);
{
world_copy_replace(&G.published_tick, &G.world); 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); atomic_u64_eval_exchange(&G.published_tick_id, G.published_tick.tick_id);
sys_mutex_unlock(&lock); sys_mutex_unlock(&lock);
} }

View File

@ -167,7 +167,10 @@ void *sys_memory_commit(void *address, u64 size);
* address space) */ * address space) */
void sys_memory_decommit(void *address, u64 size); void sys_memory_decommit(void *address, u64 size);
/* Mark committed pages as readonly */
void sys_memory_set_committed_readonly(void *address, u64 size); 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); void sys_memory_set_committed_readwrite(void *address, u64 size);
/* ========================== * /* ========================== *