reset mutex spin count after wait

This commit is contained in:
jacob 2025-07-07 02:55:56 -05:00
parent e720e7e2af
commit 0a3e9adcbd
5 changed files with 15 additions and 4 deletions

View File

@ -45,7 +45,7 @@
#define DX12_ALLOW_TEARING 1 #define DX12_ALLOW_TEARING 1
#define DX12_SWAPCHAIN_FLAGS (DX12_ALLOW_TEARING * DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) #define DX12_SWAPCHAIN_FLAGS (DX12_ALLOW_TEARING * DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING)
#define DX12_SWAPCHAIN_BUFFER_COUNT (3) #define DX12_SWAPCHAIN_BUFFER_COUNT (2)
#define DX12_SWAPCHAIN_FORMAT (DXGI_FORMAT_R8G8B8A8_UNORM) #define DX12_SWAPCHAIN_FORMAT (DXGI_FORMAT_R8G8B8A8_UNORM)
//#define DX12_SWAPCHAIN_RTV_FORMAT (DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) //#define DX12_SWAPCHAIN_RTV_FORMAT (DXGI_FORMAT_R8G8B8A8_UNORM_SRGB)

View File

@ -247,6 +247,7 @@ INTERNAL SYS_THREAD_DEF(playback_scheduler_entry, _)
/* FIXME: If playback fails at any point and mixer stops advancing, we /* FIXME: If playback fails at any point and mixer stops advancing, we
* need to halt mixer to prevent memory leak when sounds are played. */ * need to halt mixer to prevent memory leak when sounds are played. */
/* TODO: Signal counter that running job wiats on, rather than scheduling job manually */
while (!atomic_i32_fetch(&G.shutdown)) { while (!atomic_i32_fetch(&G.shutdown)) {
{ {
__profn("Wait for audio event"); __profn("Wait for audio event");

View File

@ -46,6 +46,7 @@ struct snc_lock snc_lock_spin_e(struct snc_mutex *m, i32 spin)
ix_pause(); ix_pause();
} else { } else {
sys_wait(&m->v, &v, 4, F32_INFINITY); sys_wait(&m->v, &v, 4, F32_INFINITY);
spin_cnt = 0;
} }
} }
} }
@ -82,6 +83,7 @@ struct snc_lock snc_lock_spin_s(struct snc_mutex *m, i32 spin)
ix_pause(); ix_pause();
} else { } else {
sys_wait(&m->v, &v, 4, F32_INFINITY); sys_wait(&m->v, &v, 4, F32_INFINITY);
spin_cnt = 0;
} }
} }
} }

View File

@ -186,7 +186,8 @@ STATIC_ASSERT(alignof(struct counter) == 64); /* Avoid false sharing */
#define FIBER_NAME_PREFIX_CSTR "Fiber #" #define FIBER_NAME_PREFIX_CSTR "["
#define FIBER_NAME_SUFFIX_CSTR "] Fiber"
#define FIBER_NAME_MAX_SIZE 64 #define FIBER_NAME_MAX_SIZE 64
enum yield_kind { enum yield_kind {
@ -580,10 +581,14 @@ INTERNAL struct fiber *fiber_alloc(enum fiber_kind kind)
/* Concat fiber name */ /* Concat fiber name */
i32 name_size = 1; i32 name_size = 1;
STATIC_ASSERT(sizeof(sizeof(FIBER_NAME_PREFIX_CSTR)) <= FIBER_NAME_MAX_SIZE); ASSERT(sizeof(sizeof(FIBER_NAME_PREFIX_CSTR)) <= FIBER_NAME_MAX_SIZE);
MEMCPY(new_name_cstr, FIBER_NAME_PREFIX_CSTR, sizeof(FIBER_NAME_PREFIX_CSTR)); MEMCPY(new_name_cstr, FIBER_NAME_PREFIX_CSTR, sizeof(FIBER_NAME_PREFIX_CSTR));
name_size += sizeof(FIBER_NAME_PREFIX_CSTR) - 2; name_size += sizeof(FIBER_NAME_PREFIX_CSTR) - 2;
MEMCPY(new_name_cstr + name_size, id_chars, id_chars_len); MEMCPY(new_name_cstr + name_size, id_chars, id_chars_len);
name_size += id_chars_len;
MEMCPY(new_name_cstr + name_size, FIBER_NAME_SUFFIX_CSTR, sizeof(FIBER_NAME_SUFFIX_CSTR));
name_size += sizeof(FIBER_NAME_SUFFIX_CSTR) - 2;
fiber->name_cstr = new_name_cstr; fiber->name_cstr = new_name_cstr;
/* Init win32 fiber */ /* Init win32 fiber */
@ -717,7 +722,7 @@ INTERNAL void job_fiber_entry(void *id_ptr)
while (true) { while (true) {
/* Run job */ /* Run job */
{ {
__profn("Run job"); //__profn("Run job");
volatile struct yield_param *yield_param = fiber->yield_param; volatile struct yield_param *yield_param = fiber->yield_param;
yield_param->kind = YIELD_KIND_NONE; yield_param->kind = YIELD_KIND_NONE;
struct sys_job_data data = ZI; struct sys_job_data data = ZI;

View File

@ -616,6 +616,7 @@ INTERNAL void user_update(void)
* ========================== */ * ========================== */
{ {
__profn("Pull snapshot");
struct snc_lock lock = snc_lock_e(&G.local_to_user_client_mutex); struct snc_lock lock = snc_lock_e(&G.local_to_user_client_mutex);
u64 old_last_tick = G.user_unblended_client->last_tick; u64 old_last_tick = G.user_unblended_client->last_tick;
u64 last_tick = G.local_to_user_client->last_tick; u64 last_tick = G.local_to_user_client->last_tick;
@ -641,6 +642,7 @@ INTERNAL void user_update(void)
* ========================== */ * ========================== */
{ {
__profn("Blend snapshots");
/* How along are we between sim ticks (0 = start of tick, 1 = end of tick) */ /* How along are we between sim ticks (0 = start of tick, 1 = end of tick) */
f64 tick_progress = 0; f64 tick_progress = 0;
i64 next_tick_expected_ns = G.last_local_to_user_snapshot_published_at_ns + G.average_local_to_user_snapshot_publish_dt_ns; i64 next_tick_expected_ns = G.last_local_to_user_snapshot_published_at_ns + G.average_local_to_user_snapshot_publish_dt_ns;
@ -728,6 +730,7 @@ INTERNAL void user_update(void)
* ========================== */ * ========================== */
{ {
__profn("Process sys events");
struct sys_event_array events = pop_sys_events(scratch.arena); struct sys_event_array events = pop_sys_events(scratch.arena);
/* Reset bind pressed / released states */ /* Reset bind pressed / released states */