Merge pull request #1701 from Cacodemon345/patch-15
Fix pthreads building on Windows
This commit is contained in:
@@ -48,7 +48,11 @@ if(NOT WIN32 OR PTHREAD)
|
|||||||
target_sources(86Box PRIVATE thread.c)
|
target_sources(86Box PRIVATE thread.c)
|
||||||
if(WIN32 AND VCPKG_TOOLCHAIN)
|
if(WIN32 AND VCPKG_TOOLCHAIN)
|
||||||
find_package(pthreads REQUIRED)
|
find_package(pthreads REQUIRED)
|
||||||
target_link_libraries(86Box pthreads)
|
if (PThreads4W_FOUND)
|
||||||
|
target_link_libraries(86Box PThreads4W::PThreads4W)
|
||||||
|
else()
|
||||||
|
target_link_libraries(86Box pthreads)
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
|
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
|
21
src/thread.c
21
src/thread.c
@@ -2,8 +2,13 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#ifndef _MSC_VER
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <86box/86box.h>
|
#include <86box/86box.h>
|
||||||
#include <86box/plat.h>
|
#include <86box/plat.h>
|
||||||
@@ -103,6 +108,17 @@ thread_wait_event(event_t *handle, int timeout)
|
|||||||
event_pthread_t *event = (event_pthread_t *)handle;
|
event_pthread_t *event = (event_pthread_t *)handle;
|
||||||
struct timespec abstime;
|
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);
|
clock_gettime(CLOCK_REALTIME, &abstime);
|
||||||
abstime.tv_nsec += (timeout % 1000) * 1000000;
|
abstime.tv_nsec += (timeout % 1000) * 1000000;
|
||||||
abstime.tv_sec += (timeout / 1000);
|
abstime.tv_sec += (timeout / 1000);
|
||||||
@@ -110,6 +126,7 @@ thread_wait_event(event_t *handle, int timeout)
|
|||||||
abstime.tv_nsec -= 1000000000;
|
abstime.tv_nsec -= 1000000000;
|
||||||
abstime.tv_sec++;
|
abstime.tv_sec++;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
pthread_mutex_lock(&event->mutex);
|
pthread_mutex_lock(&event->mutex);
|
||||||
if (timeout == -1) {
|
if (timeout == -1) {
|
||||||
@@ -138,7 +155,11 @@ thread_destroy_event(event_t *handle)
|
|||||||
void
|
void
|
||||||
thread_sleep(int t)
|
thread_sleep(int t)
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
Sleep(t);
|
||||||
|
#else
|
||||||
usleep(t * 1000);
|
usleep(t * 1000);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user