mirror of https://github.com/mpv-player/mpv
Revert "win32/pthread: don't convert time through unrelated timer"
This reverts commit 318b5471a1
.
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.
This commit is contained in:
parent
9a7291d48e
commit
9f147496b5
|
@ -27,7 +27,6 @@
|
||||||
#include "common/msg.h"
|
#include "common/msg.h"
|
||||||
#include "misc/random.h"
|
#include "misc/random.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
static uint64_t raw_time_offset;
|
static uint64_t raw_time_offset;
|
||||||
static pthread_once_t timer_init_once = PTHREAD_ONCE_INIT;
|
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;
|
return time_ns + ti;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !HAVE_WIN32_INTERNAL_PTHREADS
|
|
||||||
static int get_realtime(struct timespec *out_ts)
|
static int get_realtime(struct timespec *out_ts)
|
||||||
{
|
{
|
||||||
#if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0
|
#if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0
|
||||||
|
@ -87,19 +85,13 @@ static int get_realtime(struct timespec *out_ts)
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
struct timespec mp_time_ns_to_realtime(int64_t time_ns)
|
struct timespec mp_time_ns_to_realtime(int64_t time_ns)
|
||||||
{
|
{
|
||||||
struct timespec ts = {0};
|
struct timespec ts = {0};
|
||||||
|
|
||||||
#if !HAVE_WIN32_INTERNAL_PTHREADS
|
|
||||||
if (get_realtime(&ts) != 0)
|
if (get_realtime(&ts) != 0)
|
||||||
return ts;
|
return ts;
|
||||||
int64_t time_rel = time_ns - mp_time_ns();
|
int64_t time_rel = time_ns - mp_time_ns();
|
||||||
#else
|
|
||||||
int64_t time_rel = time_ns;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// clamp to 1000 days in the future
|
// clamp to 1000 days in the future
|
||||||
time_rel = MPMIN(time_rel, 1000 * 24 * 60 * 60 * INT64_C(1000000000));
|
time_rel = MPMIN(time_rel, 1000 * 24 * 60 * 60 * INT64_C(1000000000));
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include "common/common.h"
|
|
||||||
#include "osdep/timer.h" // mp_{start,end}_hires_timers
|
#include "osdep/timer.h" // mp_{start,end}_hires_timers
|
||||||
|
|
||||||
int pthread_once(pthread_once_t *once_control, void (*init_routine)(void))
|
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,
|
pthread_mutex_t *restrict mutex,
|
||||||
const struct timespec *restrict abstime)
|
const struct timespec *restrict abstime)
|
||||||
{
|
{
|
||||||
// mp time is not converted to realtime if internal pthread impl is used
|
// mpv uses mingw's gettimeofday() as time source too.
|
||||||
int64_t now = mp_time_ns();
|
struct timeval tv;
|
||||||
int64_t time_ns = abstime->tv_sec * UINT64_C(1000000000) + abstime->tv_nsec;
|
gettimeofday(&tv, NULL);
|
||||||
int64_t timeout_ms = (time_ns - now) / INT64_C(1000000);
|
DWORD timeout_ms = 0;
|
||||||
return cond_wait(cond, mutex, MPCLAMP(timeout_ms, 0, INFINITE));
|
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,
|
int pthread_cond_wait(pthread_cond_t *restrict cond,
|
||||||
|
|
Loading…
Reference in New Issue