Skip to content
Permalink
Browse files

Fixed bug 2764 - Timer is not rescheduled with the returned interval

afwlehmann

Sorry for re-opening, but it turns out that the current interval is indeed not updated. I've just checked the source code of the 2.0.3 release again:

   163	    if (current->canceled) {
   164	        interval = 0;
   165	    } else {
   166	        interval = current->callback(current->interval, current->param);
   167	    }
   168
   169	    if (interval > 0) {
   170	        /* Reschedule this timer */
   171	        current->interval = interval; // <-- this line is missing
   172	        current->scheduled = tick + interval;
   173	        SDL_AddTimerInternal(data, current);
   174	    } else {

According to the documentation: "The callback function is passed the current timer interval and the user supplied parameter from the SDL_AddTimer() call and returns the next timer interval. If the returned value from the callback is 0, the timer is canceled."

If I understand the text correctly, then the current interval should in fact be updated according to the returned value. Otherwise there would be a discrepancy between the next time for which the timer is actually re-scheduled and the value that's passed to the callback once the timer fires again.

This could be fixed by adding line #171.
  • Loading branch information
slouken committed Aug 14, 2017
1 parent 0112f61 commit 72ab258812c6c0f063fde046c82888dfbeae8c68
Showing with 1 addition and 0 deletions.
  1. +1 −0 src/timer/SDL_timer.c
@@ -168,6 +168,7 @@ SDL_TimerThread(void *_data)

if (interval > 0) {
/* Reschedule this timer */
current->interval = interval;
current->scheduled = tick + interval;
SDL_AddTimerInternal(data, current);
} else {

0 comments on commit 72ab258

Please sign in to comment.