mirror of https://github.com/encounter/SDL.git
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:
parent
6995ff18d3
commit
e187810eca
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue