summaryrefslogtreecommitdiff
path: root/include/SDL_timer.h
diff options
context:
space:
mode:
authorSam Lantinga <slouken@libsdl.org>2011-01-27 14:45:06 -0800
committerSam Lantinga <slouken@libsdl.org>2011-01-27 14:45:06 -0800
commitc824597e1079742c8dba926d1c7e3dd04a17d2fb (patch)
treef247087d23010528d5f2b1061bd1dd1ab5902810 /include/SDL_timer.h
parent8fb1cb04966f24b5231c1954a3bacf52dc1ed282 (diff)
downloadsdl-c824597e1079742c8dba926d1c7e3dd04a17d2fb.tar.gz
Improved timer implementation
The new timer model is formalized as using a separate thread to handle timer callbacks. This was the case on almost every platform before, but it's now a requirement, and simplifies the implementation and makes it perform consistently across platforms. Goals: * Minimize timer thread blocking * Dispatch timers as accurately as possible * SDL_AddTimer() and SDL_RemoveTimer() are completely threadsafe * SDL_RemoveTimer() doesn't crash with a timer that's expired or removed
Diffstat (limited to 'include/SDL_timer.h')
-rw-r--r--include/SDL_timer.h86
1 files changed, 16 insertions, 70 deletions
diff --git a/include/SDL_timer.h b/include/SDL_timer.h
index 91160f6f9..2d38a0689 100644
--- a/include/SDL_timer.h
+++ b/include/SDL_timer.h
@@ -41,104 +41,50 @@ extern "C" {
#endif
/**
- * This is the OS scheduler timeslice, in milliseconds.
- */
-#define SDL_TIMESLICE 10
-
-/**
- * This is the maximum resolution of the SDL timer on all platforms.
- */
-#define TIMER_RESOLUTION 10 /**< Experimentally determined */
-
-/**
- * Get the number of milliseconds since the SDL library initialization.
+ * \brief Get the number of milliseconds since the SDL library initialization.
*
- * Note that this value wraps if the program runs for more than ~49 days.
+ * \note This value wraps if the program runs for more than ~49 days.
*/
extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void);
/**
- * Wait a specified number of milliseconds before returning.
+ * \brief Wait a specified number of milliseconds before returning.
*/
extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms);
/**
* Function prototype for the timer callback function.
- */
-typedef Uint32(SDLCALL * SDL_TimerCallback) (Uint32 interval);
-
-/**
- * Set a callback to run after the specified number of milliseconds has
- * elapsed. The callback function is passed the current timer interval
- * and returns the next timer interval. If the returned value is the
- * same as the one passed in, the periodic alarm continues, otherwise a
- * new alarm is scheduled. If the callback returns 0, the periodic alarm
- * is cancelled.
- *
- * To cancel a currently running timer, call
- * \code SDL_SetTimer(0, NULL); \endcode
- *
- * The timer callback function may run in a different thread than your
- * main code, and so shouldn't call any functions from within itself.
- *
- * The maximum resolution of this timer is 10 ms, which means that if
- * you request a 16 ms timer, your callback will run approximately 20 ms
- * later on an unloaded system. If you wanted to set a flag signaling
- * a frame update at 30 frames per second (every 33 ms), you might set a
- * timer for 30 ms:
- * \code
- * SDL_SetTimer((33/10)*10, flag_update);
- * \endcode
- *
- * If you use this function, you need to pass ::SDL_INIT_TIMER to SDL_Init().
- *
- * Under UNIX, you should not use raise or use SIGALRM and this function
- * in the same program, as it is implemented using setitimer(). You also
- * should not use this function in multi-threaded applications as signals
- * to multi-threaded apps have undefined behavior in some implementations.
- *
- * \return 0 if successful, or -1 if there was an error.
- */
-extern DECLSPEC int SDLCALL SDL_SetTimer(Uint32 interval,
- SDL_TimerCallback callback);
-
-/**
- * \name Peter timers
- * New timer API, supports multiple timers
- * Written by Stephane Peter <megastep@lokigames.com>
- */
-/*@{*/
-
-/**
- * Function prototype for the new timer callback function.
*
* The callback function is passed the current timer interval and returns
* the next timer interval. If the returned value is the same as the one
* passed in, the periodic alarm continues, otherwise a new alarm is
* scheduled. If the callback returns 0, the periodic alarm is cancelled.
*/
-typedef Uint32(SDLCALL * SDL_NewTimerCallback) (Uint32 interval, void *param);
+typedef Uint32 (SDLCALL * SDL_TimerCallback) (Uint32 interval, void *param);
/**
- * Definition of the timer ID type.
+ * Definition of the timer ID type.
*/
-typedef struct _SDL_TimerID *SDL_TimerID;
+typedef int SDL_TimerID;
/**
- * Add a new timer to the pool of timers already running.
- * \return A timer ID, or NULL when an error occurs.
+ * \brief Add a new timer to the pool of timers already running.
+ *
+ * \return A timer ID, or NULL when an error occurs.
*/
extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval,
- SDL_NewTimerCallback
- callback, void *param);
+ SDL_TimerCallback callback,
+ void *param);
/**
- * Remove one of the multiple timers knowing its ID.
- * \return A boolean value indicating success or failure.
+ * \brief Remove a timer knowing its ID.
+ *
+ * \return A boolean value indicating success or failure.
+ *
+ * \warning It is not safe to remove a timer multiple times.
*/
extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID t);
-/*@}*//*Peter timers*/
/* Ends C function definitions when using C++ */
#ifdef __cplusplus