From e187810ecaa9c5d6a461ab3b6dbe2321ca9ffd8e Mon Sep 17 00:00:00 2001 From: Edward Rudd Date: Sat, 17 Aug 2013 18:07:29 -0400 Subject: [PATCH] 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 --- src/timer/SDL_timer.c | 13 ------------- src/timer/beos/SDL_systimer.c | 12 +++++++++++- src/timer/dummy/SDL_systimer.c | 12 +++++++++++- src/timer/psp/SDL_systimer.c | 12 +++++++++++- src/timer/unix/SDL_systimer.c | 20 +++++++++++++++++++- src/timer/windows/SDL_systimer.c | 10 +++++++++- 6 files changed, 61 insertions(+), 18 deletions(-) diff --git a/src/timer/SDL_timer.c b/src/timer/SDL_timer.c index 5b6550c1ca896..2980f4dc7a96f 100644 --- a/src/timer/SDL_timer.c +++ b/src/timer/SDL_timer.c @@ -26,8 +26,6 @@ #include "SDL_cpuinfo.h" #include "SDL_thread.h" -extern void SDL_StartTicks(void); - /* #define DEBUG_TIMERS */ typedef struct _SDL_Timer @@ -72,17 +70,6 @@ typedef struct { 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 * thread manages the active timer queue, sorted by scheduling time. * diff --git a/src/timer/beos/SDL_systimer.c b/src/timer/beos/SDL_systimer.c index edaf27501a270..fd22e4412f5b0 100644 --- a/src/timer/beos/SDL_systimer.c +++ b/src/timer/beos/SDL_systimer.c @@ -27,10 +27,16 @@ #include "SDL_timer.h" static bigtime_t start; +static SDL_bool ticks_started = SDL_FALSE; void -SDL_StartTicks(void) +SDL_InitTicks(void) { + if (ticks_started) { + return; + } + ticks_started = SDL_TRUE; + /* Set first ticks value */ start = system_time(); } @@ -38,6 +44,10 @@ SDL_StartTicks(void) Uint32 SDL_GetTicks(void) { + if (!ticks_started) { + SDL_InitTicks(); + } + return ((system_time() - start) / 1000); } diff --git a/src/timer/dummy/SDL_systimer.c b/src/timer/dummy/SDL_systimer.c index 2b5a9f8e3816c..387675db1f889 100644 --- a/src/timer/dummy/SDL_systimer.c +++ b/src/timer/dummy/SDL_systimer.c @@ -24,14 +24,24 @@ #include "SDL_timer.h" +static SDL_bool ticks_started = SDL_FALSE; + void -SDL_StartTicks(void) +SDL_InitTicks(void) { + if (ticks_started) { + return; + } + ticks_started = SDL_TRUE; } Uint32 SDL_GetTicks(void) { + if (!ticks_started) { + SDL_InitTicks(); + } + SDL_Unsupported(); return 0; } diff --git a/src/timer/psp/SDL_systimer.c b/src/timer/psp/SDL_systimer.c index 59bb4df1c3228..61c4690aa422c 100644 --- a/src/timer/psp/SDL_systimer.c +++ b/src/timer/psp/SDL_systimer.c @@ -29,14 +29,24 @@ #include 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); } Uint32 SDL_GetTicks(void) { + if (!ticks_started) { + SDL_InitTicks(); + } + struct timeval now; Uint32 ticks; diff --git a/src/timer/unix/SDL_systimer.c b/src/timer/unix/SDL_systimer.c index 596d749abc89d..7934032975327 100644 --- a/src/timer/unix/SDL_systimer.c +++ b/src/timer/unix/SDL_systimer.c @@ -56,10 +56,16 @@ mach_timebase_info_data_t mach_base_info; #endif static SDL_bool has_monotonic_time = SDL_FALSE; static struct timeval start_tv; +static SDL_bool ticks_started = SDL_FALSE; void -SDL_StartTicks(void) +SDL_InitTicks(void) { + if (ticks_started) { + return; + } + ticks_started = SDL_TRUE; + /* Set first ticks value */ #if HAVE_CLOCK_GETTIME if (clock_gettime(CLOCK_MONOTONIC, &start_ts) == 0) { @@ -80,6 +86,10 @@ SDL_StartTicks(void) Uint32 SDL_GetTicks(void) { + if (!ticks_started) { + SDL_InitTicks(); + } + Uint32 ticks; if (has_monotonic_time) { #if HAVE_CLOCK_GETTIME @@ -105,6 +115,10 @@ SDL_GetTicks(void) Uint64 SDL_GetPerformanceCounter(void) { + if (!ticks_started) { + SDL_InitTicks(); + } + Uint64 ticks; if (has_monotonic_time) { #if HAVE_CLOCK_GETTIME @@ -131,6 +145,10 @@ SDL_GetPerformanceCounter(void) Uint64 SDL_GetPerformanceFrequency(void) { + if (!ticks_started) { + SDL_InitTicks(); + } + if (has_monotonic_time) { #if HAVE_CLOCK_GETTIME return 1000000000; diff --git a/src/timer/windows/SDL_systimer.c b/src/timer/windows/SDL_systimer.c index ce6bd7a700dc6..24a0c8cec0bd5 100644 --- a/src/timer/windows/SDL_systimer.c +++ b/src/timer/windows/SDL_systimer.c @@ -29,6 +29,7 @@ #include "SDL_hints.h" +static BOOL ticks_started = FALSE; /* The first (low-resolution) ticks value of the application */ static DWORD start; @@ -76,8 +77,13 @@ SDL_TimerResolutionChanged(void *userdata, const char *name, const char *oldValu } void -SDL_StartTicks(void) +SDL_InitTicks(void) { + if (ticks_started) { + return; + } + ticks_started = TRUE; + /* Set first ticks value */ #ifdef USE_GETTICKCOUNT start = GetTickCount(); @@ -102,6 +108,8 @@ SDL_StartTicks(void) Uint32 SDL_GetTicks(void) { + if (!ticks_started) SDL_InitTicks(); + DWORD now; #ifndef USE_GETTICKCOUNT LARGE_INTEGER hires_now;