From 306da9de9e6158660b11ed144cccf1ef37d89e02 Mon Sep 17 00:00:00 2001
From: Julien Wadel <julien.wadel@belledonne-communications.com>
Date: Wed, 26 Mar 2025 10:58:47 +0100
Subject: [PATCH] Windows: Use a higher precision on time (10-16ms previously
 against < 1us ). This fix for example having 0 in stats on ending calls.

---
 src/utils/port.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/utils/port.c b/src/utils/port.c
index 155b9bb..33b6f69 100644
--- a/src/utils/port.c
+++ b/src/utils/port.c
@@ -881,20 +881,20 @@ void bctbx_shm_close(void *mem) {
 #pragma GCC diagnostic ignored "-Wunused-parameter"
 #endif // _MSC_VER
 static void _bctbx_get_cur_time(bctoolboxTimeSpec *ret, bool_t realtime) {
-#if defined(_WIN32_WCE) || defined(WIN32)
-#if defined(BCTBX_WINDOWS_DESKTOP) && !defined(ENABLE_MICROSOFT_STORE_APP) && !defined(BCTBX_WINDOWS_UWP)
-	DWORD timemillis;
+#ifdef _WIN32
 #if defined(_WIN32_WCE)
+	DWORD timemillis;
 	timemillis = GetTickCount();
-#else
-	timemillis = timeGetTime();
-#endif
 	ret->tv_sec = timemillis / 1000;
 	ret->tv_nsec = (timemillis % 1000) * 1000000LL;
 #else
-	ULONGLONG timemillis = GetTickCount64();
-	ret->tv_sec = timemillis / 1000;
-	ret->tv_nsec = (timemillis % 1000) * 1000000LL;
+	FILETIME lifeTime;
+	GetSystemTimePreciseAsFileTime(&lifeTime);
+	// conversion to Unix Epoch
+	uint64_t nsec =
+	    (((uint64_t)lifeTime.dwHighDateTime << 32ULL) + lifeTime.dwLowDateTime - 116444736000000000ULL) * 100ULL;
+	ret->tv_sec = nsec / 1000000000ULL;
+	ret->tv_nsec = nsec % 1000000000ULL;
 #endif
 #else
 	struct timespec ts;
@@ -1944,7 +1944,7 @@ void bctbx_uint32_to_str(uint8_t output_string[9], uint32_t input_uint32) {
 	output_string[4] = bctbx_byte_to_char((uint8_t)((input_uint32 >> 12) & 0x0F));
 	output_string[5] = bctbx_byte_to_char((uint8_t)((input_uint32 >> 8) & 0x0F));
 	output_string[6] = bctbx_byte_to_char((uint8_t)((input_uint32 >> 4) & 0x0F));
-	output_string[7] = bctbx_byte_to_char((uint8_t)((input_uint32) & 0x0F));
+	output_string[7] = bctbx_byte_to_char((uint8_t)((input_uint32)&0x0F));
 	output_string[8] = '\0';
 }
 
@@ -1975,7 +1975,7 @@ void bctbx_uint64_to_str(uint8_t output_string[17], uint64_t input_uint64) {
 	output_string[12] = bctbx_byte_to_char((uint8_t)((input_uint64 >> 12) & 0x0F));
 	output_string[13] = bctbx_byte_to_char((uint8_t)((input_uint64 >> 8) & 0x0F));
 	output_string[14] = bctbx_byte_to_char((uint8_t)((input_uint64 >> 4) & 0x0F));
-	output_string[15] = bctbx_byte_to_char((uint8_t)((input_uint64) & 0x0F));
+	output_string[15] = bctbx_byte_to_char((uint8_t)((input_uint64)&0x0F));
 	output_string[16] = '\0';
 }
 
-- 
GitLab