auto init the ticks if the GetTicks and the like methods are called before SDL_Init().. This prevents annoying game bugs such as caching SDL_GetPerformanceFrequency in a static initializer

This commit is contained in:
Edward Rudd 2013-08-17 18:07:29 -04:00
parent 6995ff18d3
commit e187810eca
6 changed files with 61 additions and 18 deletions

View File

@ -26,8 +26,6 @@
#include "SDL_cpuinfo.h" #include "SDL_cpuinfo.h"
#include "SDL_thread.h" #include "SDL_thread.h"
extern void SDL_StartTicks(void);
/* #define DEBUG_TIMERS */ /* #define DEBUG_TIMERS */
typedef struct _SDL_Timer typedef struct _SDL_Timer
@ -72,17 +70,6 @@ typedef struct {
static SDL_TimerData SDL_timer_data; static SDL_TimerData SDL_timer_data;
static Uint32 ticks_started = 0;
void
SDL_InitTicks(void)
{
if (!ticks_started) {
SDL_StartTicks();
ticks_started = 1;
}
}
/* The idea here is that any thread might add a timer, but a single /* The idea here is that any thread might add a timer, but a single
* thread manages the active timer queue, sorted by scheduling time. * thread manages the active timer queue, sorted by scheduling time.
* *

View File

@ -27,10 +27,16 @@
#include "SDL_timer.h" #include "SDL_timer.h"
static bigtime_t start; static bigtime_t start;
static SDL_bool ticks_started = SDL_FALSE;
void void
SDL_StartTicks(void) SDL_InitTicks(void)
{ {
if (ticks_started) {
return;
}
ticks_started = SDL_TRUE;
/* Set first ticks value */ /* Set first ticks value */
start = system_time(); start = system_time();
} }
@ -38,6 +44,10 @@ SDL_StartTicks(void)
Uint32 Uint32
SDL_GetTicks(void) SDL_GetTicks(void)
{ {
if (!ticks_started) {
SDL_InitTicks();
}
return ((system_time() - start) / 1000); return ((system_time() - start) / 1000);
} }

View File

@ -24,14 +24,24 @@
#include "SDL_timer.h" #include "SDL_timer.h"
static SDL_bool ticks_started = SDL_FALSE;
void void
SDL_StartTicks(void) SDL_InitTicks(void)
{ {
if (ticks_started) {
return;
}
ticks_started = SDL_TRUE;
} }
Uint32 Uint32
SDL_GetTicks(void) SDL_GetTicks(void)
{ {
if (!ticks_started) {
SDL_InitTicks();
}
SDL_Unsupported(); SDL_Unsupported();
return 0; return 0;
} }

View File

@ -29,14 +29,24 @@
#include <pspthreadman.h> #include <pspthreadman.h>
static struct timeval start; static struct timeval start;
static SDL_bool ticks_started = SDL_FALSE;
void SDL_StartTicks(void) void SDL_InitTicks(void)
{ {
if (ticks_started) {
return;
}
ticks_started = SDL_TRUE;
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
} }
Uint32 SDL_GetTicks(void) Uint32 SDL_GetTicks(void)
{ {
if (!ticks_started) {
SDL_InitTicks();
}
struct timeval now; struct timeval now;
Uint32 ticks; Uint32 ticks;

View File

@ -56,10 +56,16 @@ mach_timebase_info_data_t mach_base_info;
#endif #endif
static SDL_bool has_monotonic_time = SDL_FALSE; static SDL_bool has_monotonic_time = SDL_FALSE;
static struct timeval start_tv; static struct timeval start_tv;
static SDL_bool ticks_started = SDL_FALSE;
void void
SDL_StartTicks(void) SDL_InitTicks(void)
{ {
if (ticks_started) {
return;
}
ticks_started = SDL_TRUE;
/* Set first ticks value */ /* Set first ticks value */
#if HAVE_CLOCK_GETTIME #if HAVE_CLOCK_GETTIME
if (clock_gettime(CLOCK_MONOTONIC, &start_ts) == 0) { if (clock_gettime(CLOCK_MONOTONIC, &start_ts) == 0) {
@ -80,6 +86,10 @@ SDL_StartTicks(void)
Uint32 Uint32
SDL_GetTicks(void) SDL_GetTicks(void)
{ {
if (!ticks_started) {
SDL_InitTicks();
}
Uint32 ticks; Uint32 ticks;
if (has_monotonic_time) { if (has_monotonic_time) {
#if HAVE_CLOCK_GETTIME #if HAVE_CLOCK_GETTIME
@ -105,6 +115,10 @@ SDL_GetTicks(void)
Uint64 Uint64
SDL_GetPerformanceCounter(void) SDL_GetPerformanceCounter(void)
{ {
if (!ticks_started) {
SDL_InitTicks();
}
Uint64 ticks; Uint64 ticks;
if (has_monotonic_time) { if (has_monotonic_time) {
#if HAVE_CLOCK_GETTIME #if HAVE_CLOCK_GETTIME
@ -131,6 +145,10 @@ SDL_GetPerformanceCounter(void)
Uint64 Uint64
SDL_GetPerformanceFrequency(void) SDL_GetPerformanceFrequency(void)
{ {
if (!ticks_started) {
SDL_InitTicks();
}
if (has_monotonic_time) { if (has_monotonic_time) {
#if HAVE_CLOCK_GETTIME #if HAVE_CLOCK_GETTIME
return 1000000000; return 1000000000;

View File

@ -29,6 +29,7 @@
#include "SDL_hints.h" #include "SDL_hints.h"
static BOOL ticks_started = FALSE;
/* The first (low-resolution) ticks value of the application */ /* The first (low-resolution) ticks value of the application */
static DWORD start; static DWORD start;
@ -76,8 +77,13 @@ SDL_TimerResolutionChanged(void *userdata, const char *name, const char *oldValu
} }
void void
SDL_StartTicks(void) SDL_InitTicks(void)
{ {
if (ticks_started) {
return;
}
ticks_started = TRUE;
/* Set first ticks value */ /* Set first ticks value */
#ifdef USE_GETTICKCOUNT #ifdef USE_GETTICKCOUNT
start = GetTickCount(); start = GetTickCount();
@ -102,6 +108,8 @@ SDL_StartTicks(void)
Uint32 Uint32
SDL_GetTicks(void) SDL_GetTicks(void)
{ {
if (!ticks_started) SDL_InitTicks();
DWORD now; DWORD now;
#ifndef USE_GETTICKCOUNT #ifndef USE_GETTICKCOUNT
LARGE_INTEGER hires_now; LARGE_INTEGER hires_now;