diff options
author | sfan5 <sfan5@live.de> | 2023-10-17 13:52:54 +0200 |
---|---|---|
committer | sfan5 <sfan5@live.de> | 2023-10-20 21:30:51 +0200 |
commit | 9f147496b50e1d281b61e9659401d0abdfc97d3f (patch) | |
tree | c5bf6a5575d2be5d049fea5debf1c0a1d8909b58 | |
parent | 9a7291d48ea8ee9c661a7a1f70de1c75cad17336 (diff) | |
download | mpv-9f147496b50e1d281b61e9659401d0abdfc97d3f.tar.bz2 mpv-9f147496b50e1d281b61e9659401d0abdfc97d3f.tar.xz |
Revert "win32/pthread: don't convert time through unrelated timer"
This reverts commit 318b5471a18e464cfcd1f7222da7853b7056f9fc.
While it may work, changing these two functions in violation of their documented
behaviour for the sake of a shortcut is a hack that will spell disaster sooner or later.
This is a partial revert since the commit in question also contained a hidden
bugfix where it swapped the calculation order for time_rel.
-rw-r--r-- | osdep/timer.c | 8 | ||||
-rw-r--r-- | osdep/win32/pthread.c | 22 |
2 files changed, 16 insertions, 14 deletions
diff --git a/osdep/timer.c b/osdep/timer.c index e939ef5dd5..6e8ce7d65f 100644 --- a/osdep/timer.c +++ b/osdep/timer.c @@ -27,7 +27,6 @@ #include "common/msg.h" #include "misc/random.h" #include "timer.h" -#include "config.h" static uint64_t raw_time_offset; static pthread_once_t timer_init_once = PTHREAD_ONCE_INIT; @@ -73,7 +72,6 @@ int64_t mp_time_ns_add(int64_t time_ns, double timeout_sec) return time_ns + ti; } -#if !HAVE_WIN32_INTERNAL_PTHREADS static int get_realtime(struct timespec *out_ts) { #if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0 @@ -87,19 +85,13 @@ static int get_realtime(struct timespec *out_ts) return 0; #endif } -#endif struct timespec mp_time_ns_to_realtime(int64_t time_ns) { struct timespec ts = {0}; - -#if !HAVE_WIN32_INTERNAL_PTHREADS if (get_realtime(&ts) != 0) return ts; int64_t time_rel = time_ns - mp_time_ns(); -#else - int64_t time_rel = time_ns; -#endif // clamp to 1000 days in the future time_rel = MPMIN(time_rel, 1000 * 24 * 60 * 60 * INT64_C(1000000000)); diff --git a/osdep/win32/pthread.c b/osdep/win32/pthread.c index 905f1107f7..a178d72253 100644 --- a/osdep/win32/pthread.c +++ b/osdep/win32/pthread.c @@ -23,7 +23,6 @@ #include <assert.h> #include <windows.h> -#include "common/common.h" #include "osdep/timer.h" // mp_{start,end}_hires_timers int pthread_once(pthread_once_t *once_control, void (*init_routine)(void)) @@ -96,11 +95,22 @@ int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime) { - // mp time is not converted to realtime if internal pthread impl is used - int64_t now = mp_time_ns(); - int64_t time_ns = abstime->tv_sec * UINT64_C(1000000000) + abstime->tv_nsec; - int64_t timeout_ms = (time_ns - now) / INT64_C(1000000); - return cond_wait(cond, mutex, MPCLAMP(timeout_ms, 0, INFINITE)); + // mpv uses mingw's gettimeofday() as time source too. + struct timeval tv; + gettimeofday(&tv, NULL); + DWORD timeout_ms = 0; + if (abstime->tv_sec >= INT64_MAX / 10000) { + timeout_ms = INFINITE; + } else if (abstime->tv_sec >= tv.tv_sec) { + long long msec = (abstime->tv_sec - tv.tv_sec) * 1000LL + + abstime->tv_nsec / 1000LL / 1000LL - tv.tv_usec / 1000LL; + if (msec > INT_MAX) { + timeout_ms = INFINITE; + } else if (msec > 0) { + timeout_ms = msec; + } + } + return cond_wait(cond, mutex, timeout_ms); } int pthread_cond_wait(pthread_cond_t *restrict cond, |