summaryrefslogtreecommitdiffstats
path: root/osdep/win32
diff options
context:
space:
mode:
authorAvi Halachmi (:avih) <avihpit@yahoo.com>2021-09-15 17:04:17 +0300
committerJames Ross-Gowan <rossy@jrg.systems>2021-09-21 00:45:08 +1000
commit930b483a6842128c669cad5dc9b2cb548d5f001f (patch)
tree0734f48b88b02c60569bf40f403b2a63e4a540c7 /osdep/win32
parent7b9e024f3713591db317b11b898eb6f132353736 (diff)
downloadmpv-930b483a6842128c669cad5dc9b2cb548d5f001f.tar.bz2
mpv-930b483a6842128c669cad5dc9b2cb548d5f001f.tar.xz
win32: Windows 10: timeBeginPeriod on demand
Before this commit, timeBeginPeriod(1) was set once when mpv starts, and the timers remained hi-res till mpv exits. Now we do the same as before on Windows version < 10. On Windows 10+ we now use timeBeginPeriod if needed, per timeout. To force a mode regardless of Windows version, set env MPV_HRT: - "always": the old behavior - hires timers as long as mpv runs. - "perwait": sets 1ms timer resolution if timeout <= 50ms. - "never": don't use timeBeginPeriod at all. It was observed that on Windows 10 we lose about 0.5ms accuracy of timeouts with "perwait" mode (acceptable), but otherwise it works well for continuous timeouts (one after the other) and random ones. On Windows 7 with "perwait": continous timeouts are accurate, but random timeouts (after some time without timeouts) have bad accuracy - roughly 16ms resolution instead of the requested 1ms. Windows 8 was not tested, so to err on the side of caution, we keep the legacy behavior "always" by default.
Diffstat (limited to 'osdep/win32')
-rw-r--r--osdep/win32/pthread.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/osdep/win32/pthread.c b/osdep/win32/pthread.c
index 141ecfc5e0..e892d441cf 100644
--- a/osdep/win32/pthread.c
+++ b/osdep/win32/pthread.c
@@ -22,6 +22,8 @@
#include <sys/time.h>
#include <assert.h>
+#include "osdep/timer.h" // mp_{start,end}_hires_timers
+
int pthread_once(pthread_once_t *once_control, void (*init_routine)(void))
{
BOOL pending;
@@ -78,11 +80,13 @@ static int cond_wait(pthread_cond_t *restrict cond,
DWORD ms)
{
BOOL res;
+ int hrt = mp_start_hires_timers(ms);
if (mutex->use_cs) {
res = SleepConditionVariableCS(cond, &mutex->lock.cs, ms);
} else {
res = SleepConditionVariableSRW(cond, &mutex->lock.srw, ms, 0);
}
+ mp_end_hires_timers(hrt);
return res ? 0 : ETIMEDOUT;
}