summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--osdep/timer-win2.c12
-rw-r--r--osdep/timer.c9
-rw-r--r--player/main.c4
3 files changed, 18 insertions, 7 deletions
diff --git a/osdep/timer-win2.c b/osdep/timer-win2.c
index 136bb0becc..ed09ed18db 100644
--- a/osdep/timer-win2.c
+++ b/osdep/timer-win2.c
@@ -21,6 +21,7 @@
#include <windows.h>
#include <sys/time.h>
#include <mmsystem.h>
+#include <stdlib.h>
#include "timer.h"
void mp_sleep_us(int64_t us)
@@ -42,8 +43,15 @@ uint64_t mp_raw_time_us(void)
return tv.tv_sec * 1000000LL + tv.tv_usec;
}
+static void restore_timer(void)
+{
+ // The MSDN documents that begin/end "must" be matched. This satisfies
+ // this requirement.
+ timeEndPeriod(1);
+}
+
void mp_raw_time_init(void)
{
- // request 1ms timer resolution
- timeBeginPeriod(1);
+ timeBeginPeriod(1); // request 1ms timer resolution
+ atexit(restore_timer);
}
diff --git a/osdep/timer.c b/osdep/timer.c
index d8dd49b9f7..f2c64959ab 100644
--- a/osdep/timer.c
+++ b/osdep/timer.c
@@ -16,12 +16,14 @@
*/
#include <stdlib.h>
+#include <pthread.h>
#include "timer.h"
static uint64_t raw_time_offset;
+pthread_once_t timer_init_once = PTHREAD_ONCE_INIT;
-void mp_time_init(void)
+static void do_timer_init(void)
{
mp_raw_time_init();
srand(mp_raw_time_us());
@@ -32,6 +34,11 @@ void mp_time_init(void)
raw_time_offset -= 10000000;
}
+void mp_time_init(void)
+{
+ pthread_once(&timer_init_once, do_timer_init);
+}
+
int64_t mp_time_us(void)
{
return mp_raw_time_us() - raw_time_offset;
diff --git a/player/main.c b/player/main.c
index 1709776fa7..e0371cc5ca 100644
--- a/player/main.c
+++ b/player/main.c
@@ -130,10 +130,6 @@ static MP_NORETURN void exit_player(struct MPContext *mpctx,
mp_lua_uninit(mpctx);
#endif
-#if defined(__MINGW32__)
- timeEndPeriod(1);
-#endif
-
#if HAVE_COCOA
cocoa_set_input_context(NULL);
#endif