From fb80091ac322c8a41bf8b983499596b5eec356b5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gustaf=20Alh=C3=A4ll?= <gustaf@hanicef.me>
Date: Mon, 6 Jan 2025 09:49:04 +0100
Subject: [PATCH] Double slack time for busy-wait

---
 src/dedicated/i_system.c | 23 ++++++++++++++++-------
 src/sdl/i_system.c       |  2 +-
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/dedicated/i_system.c b/src/dedicated/i_system.c
index 23c0149ca7..79cdd9bb6d 100644
--- a/src/dedicated/i_system.c
+++ b/src/dedicated/i_system.c
@@ -376,13 +376,22 @@ void I_SleepDuration(precise_t duration)
 {
 #if defined(__linux__) || defined(__FreeBSD__)
 	UINT64 precision = I_GetPrecisePrecision();
-	struct timespec ts = {
-		.tv_sec = duration / precision,
-		.tv_nsec = duration * 1000000000 / precision % 1000000000,
-	};
-	int status;
-	do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts);
-	while (status == EINTR);
+	precise_t dest = I_GetPreciseTime() + duration;
+	precise_t slack = (precision / 5000); // 0.2 ms slack
+	if (duration > slack)
+	{
+		duration -= slack;
+		struct timespec ts = {
+			.tv_sec = duration / precision,
+			.tv_nsec = duration * 1000000000 / precision % 1000000000,
+		};
+		int status;
+		do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts);
+		while (status == EINTR);
+	}
+
+	// busy-wait the rest
+	while (((INT64)dest - (INT64)I_GetPreciseTime()) > 0);
 #else
 	UINT64 precision = I_GetPrecisePrecision();
 	INT32 sleepvalue = cv_sleep.value;
diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c
index f32d97e227..f78f74d57c 100644
--- a/src/sdl/i_system.c
+++ b/src/sdl/i_system.c
@@ -2310,7 +2310,7 @@ void I_SleepDuration(precise_t duration)
 #if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__)
 	UINT64 precision = I_GetPrecisePrecision();
 	precise_t dest = I_GetPreciseTime() + duration;
-	precise_t slack = (precision / 10000); // 0.1 ms slack
+	precise_t slack = (precision / 5000); // 0.2 ms slack
 	if (duration > slack)
 	{
 		duration -= slack;
-- 
GitLab