diff options
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/timer-win2.c | 12 | ||||
-rw-r--r-- | osdep/timer.c | 9 |
2 files changed, 18 insertions, 3 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; |