timer: init only once

This avoids trouble if another mpv instance is initialized in the same
process.

Since timeBeginPeriod/timeEndPeriod are hereby not easily matched
anymore, use an atexit() handler to call timeEndPeriod, so that we
can be sure these calls are matched, even if we allow multiple
initializations later when introducing the client API.
This commit is contained in:
wm4 2014-02-06 21:04:24 +01:00
parent 8437356b6c
commit c6166ff448
3 changed files with 18 additions and 7 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -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