From f5fa492e260f558473b6aac0af34f9acd5ac8bfc Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 20 Oct 2013 20:42:55 -0700 Subject: [PATCH] Added a macro SDL_TICKS_PASSED() to correctly compare two 32-bit tick values. Went through the code and used the macro and fixed a couple places that were using incorrect timestamp comparisons. --- include/SDL_timer.h | 11 +++++++++++ src/audio/arts/SDL_artsaudio.c | 2 +- src/audio/bsd/SDL_bsdaudio.c | 4 +--- src/audio/esd/SDL_esdaudio.c | 3 +-- src/audio/paudio/SDL_paudio.c | 4 +--- src/events/SDL_events.c | 2 +- src/haptic/windows/SDL_syshaptic.c | 2 +- src/power/uikit/SDL_syspower.m | 6 +----- src/thread/pthread/SDL_syssem.c | 2 +- src/video/cocoa/SDL_cocoaevents.m | 2 +- src/video/x11/SDL_x11events.c | 4 ++-- src/video/x11/SDL_x11window.c | 2 +- 12 files changed, 23 insertions(+), 21 deletions(-) diff --git a/include/SDL_timer.h b/include/SDL_timer.h index e065cf4f9f1e0..28ab415b4087f 100644 --- a/include/SDL_timer.h +++ b/include/SDL_timer.h @@ -44,6 +44,17 @@ extern "C" { */ extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); +/** + * \brief Compare SDL ticks values, and return true if A has passed B + * + * e.g. if you want to wait 100 ms, you could do this: + * Uint32 timeout = SDL_GetTicks() + 100; + * while (!SDL_TICKS_PASSED(SDL_GetTicks(), timeout)) { + * ... do work until timeout has elapsed + * } + */ +#define SDL_TICKS_PASSED(A, B) ((Sint32)((B) - (A)) <= 0) + /** * \brief Get the current value of the high resolution counter */ diff --git a/src/audio/arts/SDL_artsaudio.c b/src/audio/arts/SDL_artsaudio.c index bd8064326f0f0..7e835c18a2676 100644 --- a/src/audio/arts/SDL_artsaudio.c +++ b/src/audio/arts/SDL_artsaudio.c @@ -220,7 +220,7 @@ static int ARTS_Suspend(void) { const Uint32 abortms = SDL_GetTicks() + 3000; /* give up after 3 secs */ - while ( (!SDL_NAME(arts_suspended)()) && (SDL_GetTicks() < abortms) ) { + while ( (!SDL_NAME(arts_suspended)()) && !SDL_TICKS_PASSED(SDL_GetTicks(), abortms) ) { if ( SDL_NAME(arts_suspend)() ) { break; } diff --git a/src/audio/bsd/SDL_bsdaudio.c b/src/audio/bsd/SDL_bsdaudio.c index ad51dc387c001..6694683bd4a83 100644 --- a/src/audio/bsd/SDL_bsdaudio.c +++ b/src/audio/bsd/SDL_bsdaudio.c @@ -125,9 +125,7 @@ BSDAUDIO_WaitDevice(_THIS) /* Use timer for general audio synchronization */ Sint32 ticks; - ticks = - ((Sint32) (this->hidden->next_frame - SDL_GetTicks())) - - FUDGE_TICKS; + ticks = ((Sint32) (this->hidden->next_frame - SDL_GetTicks())) - FUDGE_TICKS; if (ticks > 0) { SDL_Delay(ticks); } diff --git a/src/audio/esd/SDL_esdaudio.c b/src/audio/esd/SDL_esdaudio.c index c630565625c96..8bba640988d83 100644 --- a/src/audio/esd/SDL_esdaudio.c +++ b/src/audio/esd/SDL_esdaudio.c @@ -135,8 +135,7 @@ ESD_WaitDevice(_THIS) } /* Use timer for general audio synchronization */ - ticks = - ((Sint32) (this->hidden->next_frame - SDL_GetTicks())) - FUDGE_TICKS; + ticks = ((Sint32) (this->hidden->next_frame - SDL_GetTicks())) - FUDGE_TICKS; if (ticks > 0) { SDL_Delay(ticks); } diff --git a/src/audio/paudio/SDL_paudio.c b/src/audio/paudio/SDL_paudio.c index 6584ddd869ef6..8a248af4e34df 100644 --- a/src/audio/paudio/SDL_paudio.c +++ b/src/audio/paudio/SDL_paudio.c @@ -133,9 +133,7 @@ PAUDIO_WaitDevice(_THIS) /* Use timer for general audio synchronization */ Sint32 ticks; - ticks = - ((Sint32) (this->hidden->next_frame - SDL_GetTicks())) - - FUDGE_TICKS; + ticks = ((Sint32) (this->hidden->next_frame - SDL_GetTicks())) - FUDGE_TICKS; if (ticks > 0) { SDL_Delay(ticks); } diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index 9213dae576c11..53ba23fb2c797 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -443,7 +443,7 @@ SDL_WaitEventTimeout(SDL_Event * event, int timeout) /* Polling and no events, just return */ return 0; } - if (timeout > 0 && ((int) (SDL_GetTicks() - expiration) >= 0)) { + if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)) { /* Timeout expired and no events */ return 0; } diff --git a/src/haptic/windows/SDL_syshaptic.c b/src/haptic/windows/SDL_syshaptic.c index 68447a9b10b4a..d7edf0fac732f 100644 --- a/src/haptic/windows/SDL_syshaptic.c +++ b/src/haptic/windows/SDL_syshaptic.c @@ -1567,7 +1567,7 @@ SDL_RunXInputHaptic(void *arg) SDL_LockMutex(hwdata->mutex); /* If we're currently running and need to stop... */ if (hwdata->stopTicks) { - if ((hwdata->stopTicks != SDL_HAPTIC_INFINITY) && (hwdata->stopTicks < SDL_GetTicks())) { + if ((hwdata->stopTicks != SDL_HAPTIC_INFINITY) && SDL_TIMESTAMP_PASSED(SDL_GetTicks(), hwdata->stopTicks)) { XINPUT_VIBRATION vibration = { 0, 0 }; hwdata->stopTicks = 0; XINPUTSETSTATE(hwdata->userid, &vibration); diff --git a/src/power/uikit/SDL_syspower.m b/src/power/uikit/SDL_syspower.m index 3364da56ee2f2..f870ea2a9b29a 100644 --- a/src/power/uikit/SDL_syspower.m +++ b/src/power/uikit/SDL_syspower.m @@ -38,11 +38,7 @@ SDL_UIKit_UpdateBatteryMonitoring(void) { if (SDL_UIKitLastPowerInfoQuery) { - const Uint32 prev = SDL_UIKitLastPowerInfoQuery; - const UInt32 now = SDL_GetTicks(); - const UInt32 ticks = now - prev; - /* if timer wrapped (now < prev), shut down, too. */ - if ((now < prev) || (ticks >= BATTERY_MONITORING_TIMEOUT)) { + if (SDL_TICKS_PASSED(SDL_GetTicks(), SDL_UIKitLastPowerInfoQuery + BATTERY_MONITORING_TIMEOUT)) { UIDevice *uidev = [UIDevice currentDevice]; SDL_assert([uidev isBatteryMonitoringEnabled] == YES); [uidev setBatteryMonitoringEnabled:NO]; diff --git a/src/thread/pthread/SDL_syssem.c b/src/thread/pthread/SDL_syssem.c index b10f9b0dfa1ae..e1613fc307435 100644 --- a/src/thread/pthread/SDL_syssem.c +++ b/src/thread/pthread/SDL_syssem.c @@ -156,7 +156,7 @@ SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout) #else end = SDL_GetTicks() + timeout; while ((retval = SDL_SemTryWait(sem)) == SDL_MUTEX_TIMEDOUT) { - if ((Sint32)(SDL_GetTicks() - end) >= 0) { + if (SDL_TICKS_PASSED(SDL_GetTicks(), end)) { break; } SDL_Delay(1); diff --git a/src/video/cocoa/SDL_cocoaevents.m b/src/video/cocoa/SDL_cocoaevents.m index 1dc0ca6252567..e6b292b0bda57 100644 --- a/src/video/cocoa/SDL_cocoaevents.m +++ b/src/video/cocoa/SDL_cocoaevents.m @@ -271,7 +271,7 @@ - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filenam SDL_VideoData *data = (SDL_VideoData *)_this->driverdata; Uint32 now = SDL_GetTicks(); if (!data->screensaver_activity || - (int)(now-data->screensaver_activity) >= 30000) { + SDL_TICKS_PASSED(now, data->screensaver_activity + 30000)) { UpdateSystemActivity(UsrActivity); data->screensaver_activity = now; } diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index df5a04e7e400b..ba5eca39de282 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -909,7 +909,7 @@ X11_HandleFocusChanges(_THIS) SDL_WindowData *data = videodata->windowlist[i]; if (data && data->pending_focus != PENDING_FOCUS_NONE) { Uint32 now = SDL_GetTicks(); - if ( (int)(data->pending_focus_time-now) <= 0 ) { + if (SDL_TICKS_PASSED(now, data->pending_focus_time)) { if ( data->pending_focus == PENDING_FOCUS_IN ) { X11_DispatchFocusIn(data); } else { @@ -963,7 +963,7 @@ X11_PumpEvents(_THIS) if (_this->suspend_screensaver) { Uint32 now = SDL_GetTicks(); if (!data->screensaver_activity || - (int) (now - data->screensaver_activity) >= 30000) { + SDL_TICKS_PASSED(now, data->screensaver_activity + 30000)) { X11_XResetScreenSaver(data->display); #if SDL_USE_LIBDBUS diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 120b803cae393..62a7e730512a8 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -66,7 +66,7 @@ X11_XIfEventTimeout(Display *display, XEvent *event_return, Bool (*predicate)(), Uint32 start = SDL_GetTicks(); while (!X11_XCheckIfEvent(display, event_return, predicate, arg)) { - if ((SDL_GetTicks() - start) >= timeoutMS) { + if (SDL_TICKS_PASSED(SDL_GetTicks(), start + timeoutMS)) { return False; } }