From 39653e366add5d9f4b3d284606a892f5ecbe6495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sat, 18 Sep 2021 18:39:36 +0200 Subject: [PATCH] Fix pthreads on non-MinGW Windows builds - Use C11 standard `timespec_get` instead of `clock_gettime` - Remove the unused `thread_sleep` function --- CMakeLists.txt | 7 +++++++ src/thread.c | 36 +++++------------------------------- 2 files changed, 12 insertions(+), 31 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e565b001..8f2382dcb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -104,4 +104,11 @@ if(MSVC_TOOLSET_VERSION GREATER_EQUAL 142 AND ARCH STREQUAL "arm64") endif() endif() +# HACK: MinGW does not have `timespec_get` +include(CheckSymbolExists) +check_symbol_exists(timespec_get time.h HAS_TIMESPEC_GET) +if(HAS_TIMESPEC_GET) + add_compile_definitions(HAS_TIMESPEC_GET) +endif() + add_subdirectory(src) diff --git a/src/thread.c b/src/thread.c index b5151e573..8dd321c88 100644 --- a/src/thread.c +++ b/src/thread.c @@ -2,17 +2,14 @@ #include #include #include -#ifndef _MSC_VER -#include -#include -#endif -#ifdef _WIN32 -#include -#endif #include #include <86box/86box.h> #include <86box/plat.h> +#ifndef HAS_TIMESPEC_GET +# define timespec_get(ts, _) clock_gettime(CLOCK_REALTIME, ts) +#endif + typedef struct event_pthread_t { @@ -108,25 +105,13 @@ thread_wait_event(event_t *handle, int timeout) event_pthread_t *event = (event_pthread_t *)handle; struct timespec abstime; -#ifdef _MSC_VER - /* Taken from https://stackoverflow.com/a/31335254 with some modifications. */ - FILETIME systime; - uint64_t systimeint = 0; - GetSystemTimeAsFileTime(&systime); - systimeint |= systime.dwLowDateTime; - systimeint |= (uint64_t)systime.dwHighDateTime << 32i64; - systimeint -= 116444736000000000i64; - abstime.tv_sec = systimeint / 10000000i64; - abstime.tv_nsec = systimeint % 10000000i64 * 100; -#else - clock_gettime(CLOCK_REALTIME, &abstime); + timespec_get(&abstime, TIME_UTC); abstime.tv_nsec += (timeout % 1000) * 1000000; abstime.tv_sec += (timeout / 1000); if (abstime.tv_nsec > 1000000000) { abstime.tv_nsec -= 1000000000; abstime.tv_sec++; } -#endif pthread_mutex_lock(&event->mutex); if (timeout == -1) { @@ -152,17 +137,6 @@ thread_destroy_event(event_t *handle) } -void -thread_sleep(int t) -{ -#ifdef _WIN32 - Sleep(t); -#else - usleep(t * 1000); -#endif -} - - mutex_t * thread_create_mutex(void) {