From dcbabbdfd12885bae050271ddbb92308727e4906 Mon Sep 17 00:00:00 2001 From: jacob Date: Mon, 10 Feb 2025 16:37:32 -0600 Subject: [PATCH] fix precise sleep inaccurate because scheduler period not set --- src/host.c | 2 +- src/host.h | 1 - src/sock.h | 3 +-- src/sock_win32.c | 12 +++--------- src/sys_win32.c | 7 ++++--- src/user.c | 2 ++ 6 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/host.c b/src/host.c index 83fcd285..6db45c2b 100644 --- a/src/host.c +++ b/src/host.c @@ -1023,7 +1023,7 @@ INTERNAL SYS_THREAD_ENTRY_POINT_FUNC_DEF(host_receiver_thread_entry_point, arg) struct atomic_i32 *shutdown = &host->receiver_thread_shutdown_flag; while (!atomic_i32_eval(shutdown)) { - struct sock *sock = sock_wait_for_available_read(socks, NULL, F32_INFINITY); + struct sock *sock = sock_wait_for_available_read(socks, F32_INFINITY); struct sock_read_result res; while (!atomic_i32_eval(shutdown) && sock && (res = sock_read(sock, read_buff)).valid) { struct sock_address address = res.address; diff --git a/src/host.h b/src/host.h index 8ca41d0e..85d614b3 100644 --- a/src/host.h +++ b/src/host.h @@ -59,7 +59,6 @@ struct host_event_array { struct host { struct arena arena; - struct sock_signal *sock_signal; struct sock *sock; struct buddy_ctx *buddy; /* For storing msg assembler data */ diff --git a/src/sock.h b/src/sock.h index 54642548..8293d074 100644 --- a/src/sock.h +++ b/src/sock.h @@ -9,7 +9,6 @@ enum sock_address_family { }; struct sock; -struct sock_signal; struct sock_array { struct sock **socks; @@ -47,7 +46,7 @@ void sock_release(struct sock *sock); /* Wake anyone blocking on sock read */ void sock_wake(struct sock *sock); -struct sock *sock_wait_for_available_read(struct sock_array socks, struct sock_signal *signal, f32 timeout); +struct sock *sock_wait_for_available_read(struct sock_array socks, f32 timeout); struct sock_read_result sock_read(struct sock *sock, struct string read_buff); void sock_write(struct sock *sock, struct sock_address address, struct string data); diff --git a/src/sock_win32.c b/src/sock_win32.c index a3db478d..4336d2f9 100644 --- a/src/sock_win32.c +++ b/src/sock_win32.c @@ -372,11 +372,10 @@ void sock_wake(struct sock *sock) * Read * ========================== */ -struct sock *sock_wait_for_available_read(struct sock_array socks, struct sock_signal *signal, f32 timeout) +struct sock *sock_wait_for_available_read(struct sock_array socks, f32 timeout) { struct sock *res = NULL; - u64 num_fds = socks.count + (signal != NULL); WSAPOLLFD fds[MAX_POLL_FDS] = ZI; for (u32 i = 0; i < socks.count; ++i) { struct win32_sock *ws = (struct win32_sock *)socks.socks[i]; @@ -390,20 +389,15 @@ struct sock *sock_wait_for_available_read(struct sock_array socks, struct sock_s } else { timeout_ms = (i32)(timeout * 1000); } - WSAPoll(fds, num_fds, timeout_ms); + WSAPoll(fds, socks.count, timeout_ms); - b32 none = true; - for (u64 i = 0; i < num_fds; ++i) { + for (u64 i = 0; i < socks.count; ++i) { if (fds[i].revents & POLLRDNORM) { res = socks.socks[i]; - none = false; break; } } - if (none) { - DEBUGBREAKABLE; - } return res; } diff --git a/src/sys_win32.c b/src/sys_win32.c index 6651e86e..d7ce41dd 100644 --- a/src/sys_win32.c +++ b/src/sys_win32.c @@ -1926,9 +1926,9 @@ INTERNAL void win32_precise_sleep_timer(f64 seconds, HANDLE timer) i64 target_qpc = (i64)(qpc.QuadPart + seconds * qpc_per_second); /* TODO: Maybe increase tolerance for higher precision but more power usage */ - //const f64 tolerance = 0.001200 * scheduler_period_ms; - const f64 tolerance = 0.000520 * scheduler_period_ms; - //const f64 tolerance = 1 * scheduler_period_ms; + //const f64 tolerance = scheduler_period_ms * 0.001200; + const f64 tolerance = scheduler_period_ms * 0.000520; + //const f64 tolerance = scheduler_period_ms * 1; i64 max_ticks = (i64)scheduler_period_ms * 9500; while (true) { @@ -2066,6 +2066,7 @@ int CALLBACK wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev_instance, TIMECAPS caps; timeGetDevCaps(&caps, sizeof(caps)); + G.scheduler_period_ms = (i32)caps.wPeriodMin; /* Set up timing period */ timeBeginPeriod(G.scheduler_period_ms); diff --git a/src/user.c b/src/user.c index 2dff926b..b24debf6 100644 --- a/src/user.c +++ b/src/user.c @@ -1313,6 +1313,7 @@ INTERNAL void user_update(void) /* Draw crosshair or show cursor */ if (!G.debug_camera) { + __profscope(draw_crosshair); struct v2 crosshair_pos = G.ui_cursor; u32 tint = RGBA_32_F(1, 1, 1, 1); @@ -1331,6 +1332,7 @@ INTERNAL void user_update(void) sys_window_cursor_hide(G.window); sys_window_cursor_enable_clip(G.window, cursor_clip); } else { + __profscope(update_window_cursor); sys_window_cursor_disable_clip(G.window); sys_window_cursor_show(G.window); }