SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401938
This commit is contained in:
parent
91a32b77a2
commit
0f030a1802
686 changed files with 117556 additions and 98661 deletions
|
@ -38,12 +38,13 @@ SDL_TimerCallback SDL_alarm_callback;
|
|||
/* Data used for a thread-based timer */
|
||||
static int SDL_timer_threaded = 0;
|
||||
|
||||
struct _SDL_TimerID {
|
||||
Uint32 interval;
|
||||
SDL_NewTimerCallback cb;
|
||||
void *param;
|
||||
Uint32 last_alarm;
|
||||
struct _SDL_TimerID *next;
|
||||
struct _SDL_TimerID
|
||||
{
|
||||
Uint32 interval;
|
||||
SDL_NewTimerCallback cb;
|
||||
void *param;
|
||||
Uint32 last_alarm;
|
||||
struct _SDL_TimerID *next;
|
||||
};
|
||||
|
||||
static SDL_TimerID SDL_timers = NULL;
|
||||
|
@ -53,233 +54,247 @@ static volatile SDL_bool list_changed = SDL_FALSE;
|
|||
/* Set whether or not the timer should use a thread.
|
||||
This should not be called while the timer subsystem is running.
|
||||
*/
|
||||
int SDL_SetTimerThreaded(int value)
|
||||
int
|
||||
SDL_SetTimerThreaded(int value)
|
||||
{
|
||||
int retval;
|
||||
int retval;
|
||||
|
||||
if ( SDL_timer_started ) {
|
||||
SDL_SetError("Timer already initialized");
|
||||
retval = -1;
|
||||
} else {
|
||||
retval = 0;
|
||||
SDL_timer_threaded = value;
|
||||
}
|
||||
return retval;
|
||||
if (SDL_timer_started) {
|
||||
SDL_SetError("Timer already initialized");
|
||||
retval = -1;
|
||||
} else {
|
||||
retval = 0;
|
||||
SDL_timer_threaded = value;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
int SDL_TimerInit(void)
|
||||
int
|
||||
SDL_TimerInit(void)
|
||||
{
|
||||
int retval;
|
||||
int retval;
|
||||
|
||||
retval = 0;
|
||||
if ( SDL_timer_started ) {
|
||||
SDL_TimerQuit();
|
||||
}
|
||||
if ( ! SDL_timer_threaded ) {
|
||||
retval = SDL_SYS_TimerInit();
|
||||
}
|
||||
if ( SDL_timer_threaded ) {
|
||||
SDL_timer_mutex = SDL_CreateMutex();
|
||||
}
|
||||
if ( retval == 0 ) {
|
||||
SDL_timer_started = 1;
|
||||
}
|
||||
return(retval);
|
||||
retval = 0;
|
||||
if (SDL_timer_started) {
|
||||
SDL_TimerQuit();
|
||||
}
|
||||
if (!SDL_timer_threaded) {
|
||||
retval = SDL_SYS_TimerInit();
|
||||
}
|
||||
if (SDL_timer_threaded) {
|
||||
SDL_timer_mutex = SDL_CreateMutex();
|
||||
}
|
||||
if (retval == 0) {
|
||||
SDL_timer_started = 1;
|
||||
}
|
||||
return (retval);
|
||||
}
|
||||
|
||||
void SDL_TimerQuit(void)
|
||||
void
|
||||
SDL_TimerQuit(void)
|
||||
{
|
||||
SDL_SetTimer(0, NULL);
|
||||
if ( SDL_timer_threaded < 2 ) {
|
||||
SDL_SYS_TimerQuit();
|
||||
}
|
||||
if ( SDL_timer_threaded ) {
|
||||
SDL_DestroyMutex(SDL_timer_mutex);
|
||||
SDL_timer_mutex = NULL;
|
||||
}
|
||||
SDL_timer_started = 0;
|
||||
SDL_timer_threaded = 0;
|
||||
SDL_SetTimer(0, NULL);
|
||||
if (SDL_timer_threaded < 2) {
|
||||
SDL_SYS_TimerQuit();
|
||||
}
|
||||
if (SDL_timer_threaded) {
|
||||
SDL_DestroyMutex(SDL_timer_mutex);
|
||||
SDL_timer_mutex = NULL;
|
||||
}
|
||||
SDL_timer_started = 0;
|
||||
SDL_timer_threaded = 0;
|
||||
}
|
||||
|
||||
void SDL_ThreadedTimerCheck(void)
|
||||
void
|
||||
SDL_ThreadedTimerCheck(void)
|
||||
{
|
||||
Uint32 now, ms;
|
||||
SDL_TimerID t, prev, next;
|
||||
SDL_bool removed;
|
||||
Uint32 now, ms;
|
||||
SDL_TimerID t, prev, next;
|
||||
SDL_bool removed;
|
||||
|
||||
SDL_mutexP(SDL_timer_mutex);
|
||||
list_changed = SDL_FALSE;
|
||||
now = SDL_GetTicks();
|
||||
for ( prev = NULL, t = SDL_timers; t; t = next ) {
|
||||
removed = SDL_FALSE;
|
||||
ms = t->interval - SDL_TIMESLICE;
|
||||
next = t->next;
|
||||
if ( (int)(now - t->last_alarm) > (int)ms ) {
|
||||
struct _SDL_TimerID timer;
|
||||
SDL_mutexP(SDL_timer_mutex);
|
||||
list_changed = SDL_FALSE;
|
||||
now = SDL_GetTicks();
|
||||
for (prev = NULL, t = SDL_timers; t; t = next) {
|
||||
removed = SDL_FALSE;
|
||||
ms = t->interval - SDL_TIMESLICE;
|
||||
next = t->next;
|
||||
if ((int) (now - t->last_alarm) > (int) ms) {
|
||||
struct _SDL_TimerID timer;
|
||||
|
||||
if ( (now - t->last_alarm) < t->interval ) {
|
||||
t->last_alarm += t->interval;
|
||||
} else {
|
||||
t->last_alarm = now;
|
||||
}
|
||||
if ((now - t->last_alarm) < t->interval) {
|
||||
t->last_alarm += t->interval;
|
||||
} else {
|
||||
t->last_alarm = now;
|
||||
}
|
||||
#ifdef DEBUG_TIMERS
|
||||
printf("Executing timer %p (thread = %d)\n",
|
||||
t, SDL_ThreadID());
|
||||
printf("Executing timer %p (thread = %d)\n", t, SDL_ThreadID());
|
||||
#endif
|
||||
timer = *t;
|
||||
SDL_mutexV(SDL_timer_mutex);
|
||||
ms = timer.cb(timer.interval, timer.param);
|
||||
SDL_mutexP(SDL_timer_mutex);
|
||||
if ( list_changed ) {
|
||||
/* Abort, list of timers modified */
|
||||
/* FIXME: what if ms was changed? */
|
||||
break;
|
||||
}
|
||||
if ( ms != t->interval ) {
|
||||
if ( ms ) {
|
||||
t->interval = ROUND_RESOLUTION(ms);
|
||||
} else {
|
||||
/* Remove timer from the list */
|
||||
timer = *t;
|
||||
SDL_mutexV(SDL_timer_mutex);
|
||||
ms = timer.cb(timer.interval, timer.param);
|
||||
SDL_mutexP(SDL_timer_mutex);
|
||||
if (list_changed) {
|
||||
/* Abort, list of timers modified */
|
||||
/* FIXME: what if ms was changed? */
|
||||
break;
|
||||
}
|
||||
if (ms != t->interval) {
|
||||
if (ms) {
|
||||
t->interval = ROUND_RESOLUTION(ms);
|
||||
} else {
|
||||
/* Remove timer from the list */
|
||||
#ifdef DEBUG_TIMERS
|
||||
printf("SDL: Removing timer %p\n", t);
|
||||
printf("SDL: Removing timer %p\n", t);
|
||||
#endif
|
||||
if ( prev ) {
|
||||
prev->next = next;
|
||||
} else {
|
||||
SDL_timers = next;
|
||||
}
|
||||
SDL_free(t);
|
||||
--SDL_timer_running;
|
||||
removed = SDL_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Don't update prev if the timer has disappeared */
|
||||
if ( ! removed ) {
|
||||
prev = t;
|
||||
}
|
||||
}
|
||||
SDL_mutexV(SDL_timer_mutex);
|
||||
if (prev) {
|
||||
prev->next = next;
|
||||
} else {
|
||||
SDL_timers = next;
|
||||
}
|
||||
SDL_free(t);
|
||||
--SDL_timer_running;
|
||||
removed = SDL_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Don't update prev if the timer has disappeared */
|
||||
if (!removed) {
|
||||
prev = t;
|
||||
}
|
||||
}
|
||||
SDL_mutexV(SDL_timer_mutex);
|
||||
}
|
||||
|
||||
static SDL_TimerID SDL_AddTimerInternal(Uint32 interval, SDL_NewTimerCallback callback, void *param)
|
||||
static SDL_TimerID
|
||||
SDL_AddTimerInternal(Uint32 interval, SDL_NewTimerCallback callback,
|
||||
void *param)
|
||||
{
|
||||
SDL_TimerID t;
|
||||
t = (SDL_TimerID) SDL_malloc(sizeof(struct _SDL_TimerID));
|
||||
if ( t ) {
|
||||
t->interval = ROUND_RESOLUTION(interval);
|
||||
t->cb = callback;
|
||||
t->param = param;
|
||||
t->last_alarm = SDL_GetTicks();
|
||||
t->next = SDL_timers;
|
||||
SDL_timers = t;
|
||||
++SDL_timer_running;
|
||||
list_changed = SDL_TRUE;
|
||||
}
|
||||
SDL_TimerID t;
|
||||
t = (SDL_TimerID) SDL_malloc(sizeof(struct _SDL_TimerID));
|
||||
if (t) {
|
||||
t->interval = ROUND_RESOLUTION(interval);
|
||||
t->cb = callback;
|
||||
t->param = param;
|
||||
t->last_alarm = SDL_GetTicks();
|
||||
t->next = SDL_timers;
|
||||
SDL_timers = t;
|
||||
++SDL_timer_running;
|
||||
list_changed = SDL_TRUE;
|
||||
}
|
||||
#ifdef DEBUG_TIMERS
|
||||
printf("SDL_AddTimer(%d) = %08x num_timers = %d\n", interval, (Uint32)t, SDL_timer_running);
|
||||
printf("SDL_AddTimer(%d) = %08x num_timers = %d\n", interval, (Uint32) t,
|
||||
SDL_timer_running);
|
||||
#endif
|
||||
return t;
|
||||
return t;
|
||||
}
|
||||
|
||||
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param)
|
||||
SDL_TimerID
|
||||
SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param)
|
||||
{
|
||||
SDL_TimerID t;
|
||||
if ( ! SDL_timer_mutex ) {
|
||||
if ( SDL_timer_started ) {
|
||||
SDL_SetError("This platform doesn't support multiple timers");
|
||||
} else {
|
||||
SDL_SetError("You must call SDL_Init(SDL_INIT_TIMER) first");
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
if ( ! SDL_timer_threaded ) {
|
||||
SDL_SetError("Multiple timers require threaded events!");
|
||||
return NULL;
|
||||
}
|
||||
SDL_mutexP(SDL_timer_mutex);
|
||||
t = SDL_AddTimerInternal(interval, callback, param);
|
||||
SDL_mutexV(SDL_timer_mutex);
|
||||
return t;
|
||||
SDL_TimerID t;
|
||||
if (!SDL_timer_mutex) {
|
||||
if (SDL_timer_started) {
|
||||
SDL_SetError("This platform doesn't support multiple timers");
|
||||
} else {
|
||||
SDL_SetError("You must call SDL_Init(SDL_INIT_TIMER) first");
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
if (!SDL_timer_threaded) {
|
||||
SDL_SetError("Multiple timers require threaded events!");
|
||||
return NULL;
|
||||
}
|
||||
SDL_mutexP(SDL_timer_mutex);
|
||||
t = SDL_AddTimerInternal(interval, callback, param);
|
||||
SDL_mutexV(SDL_timer_mutex);
|
||||
return t;
|
||||
}
|
||||
|
||||
SDL_bool SDL_RemoveTimer(SDL_TimerID id)
|
||||
SDL_bool
|
||||
SDL_RemoveTimer(SDL_TimerID id)
|
||||
{
|
||||
SDL_TimerID t, prev = NULL;
|
||||
SDL_bool removed;
|
||||
SDL_TimerID t, prev = NULL;
|
||||
SDL_bool removed;
|
||||
|
||||
removed = SDL_FALSE;
|
||||
SDL_mutexP(SDL_timer_mutex);
|
||||
/* Look for id in the linked list of timers */
|
||||
for (t = SDL_timers; t; prev=t, t = t->next ) {
|
||||
if ( t == id ) {
|
||||
if(prev) {
|
||||
prev->next = t->next;
|
||||
} else {
|
||||
SDL_timers = t->next;
|
||||
}
|
||||
SDL_free(t);
|
||||
--SDL_timer_running;
|
||||
removed = SDL_TRUE;
|
||||
list_changed = SDL_TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
removed = SDL_FALSE;
|
||||
SDL_mutexP(SDL_timer_mutex);
|
||||
/* Look for id in the linked list of timers */
|
||||
for (t = SDL_timers; t; prev = t, t = t->next) {
|
||||
if (t == id) {
|
||||
if (prev) {
|
||||
prev->next = t->next;
|
||||
} else {
|
||||
SDL_timers = t->next;
|
||||
}
|
||||
SDL_free(t);
|
||||
--SDL_timer_running;
|
||||
removed = SDL_TRUE;
|
||||
list_changed = SDL_TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#ifdef DEBUG_TIMERS
|
||||
printf("SDL_RemoveTimer(%08x) = %d num_timers = %d thread = %d\n", (Uint32)id, removed, SDL_timer_running, SDL_ThreadID());
|
||||
printf("SDL_RemoveTimer(%08x) = %d num_timers = %d thread = %d\n",
|
||||
(Uint32) id, removed, SDL_timer_running, SDL_ThreadID());
|
||||
#endif
|
||||
SDL_mutexV(SDL_timer_mutex);
|
||||
return removed;
|
||||
SDL_mutexV(SDL_timer_mutex);
|
||||
return removed;
|
||||
}
|
||||
|
||||
/* Old style callback functions are wrapped through this */
|
||||
static Uint32 SDLCALL callback_wrapper(Uint32 ms, void *param)
|
||||
static Uint32 SDLCALL
|
||||
callback_wrapper(Uint32 ms, void *param)
|
||||
{
|
||||
SDL_TimerCallback func = (SDL_TimerCallback) param;
|
||||
return (*func)(ms);
|
||||
SDL_TimerCallback func = (SDL_TimerCallback) param;
|
||||
return (*func) (ms);
|
||||
}
|
||||
|
||||
int SDL_SetTimer(Uint32 ms, SDL_TimerCallback callback)
|
||||
int
|
||||
SDL_SetTimer(Uint32 ms, SDL_TimerCallback callback)
|
||||
{
|
||||
int retval;
|
||||
int retval;
|
||||
|
||||
#ifdef DEBUG_TIMERS
|
||||
printf("SDL_SetTimer(%d)\n", ms);
|
||||
printf("SDL_SetTimer(%d)\n", ms);
|
||||
#endif
|
||||
retval = 0;
|
||||
retval = 0;
|
||||
|
||||
if ( SDL_timer_threaded ) {
|
||||
SDL_mutexP(SDL_timer_mutex);
|
||||
}
|
||||
if ( SDL_timer_running ) { /* Stop any currently running timer */
|
||||
if ( SDL_timer_threaded ) {
|
||||
while ( SDL_timers ) {
|
||||
SDL_TimerID freeme = SDL_timers;
|
||||
SDL_timers = SDL_timers->next;
|
||||
SDL_free(freeme);
|
||||
}
|
||||
SDL_timer_running = 0;
|
||||
list_changed = SDL_TRUE;
|
||||
} else {
|
||||
SDL_SYS_StopTimer();
|
||||
SDL_timer_running = 0;
|
||||
}
|
||||
}
|
||||
if ( ms ) {
|
||||
if ( SDL_timer_threaded ) {
|
||||
if ( SDL_AddTimerInternal(ms, callback_wrapper, (void *)callback) == NULL ) {
|
||||
retval = -1;
|
||||
}
|
||||
} else {
|
||||
SDL_timer_running = 1;
|
||||
SDL_alarm_interval = ms;
|
||||
SDL_alarm_callback = callback;
|
||||
retval = SDL_SYS_StartTimer();
|
||||
}
|
||||
}
|
||||
if ( SDL_timer_threaded ) {
|
||||
SDL_mutexV(SDL_timer_mutex);
|
||||
}
|
||||
if (SDL_timer_threaded) {
|
||||
SDL_mutexP(SDL_timer_mutex);
|
||||
}
|
||||
if (SDL_timer_running) { /* Stop any currently running timer */
|
||||
if (SDL_timer_threaded) {
|
||||
while (SDL_timers) {
|
||||
SDL_TimerID freeme = SDL_timers;
|
||||
SDL_timers = SDL_timers->next;
|
||||
SDL_free(freeme);
|
||||
}
|
||||
SDL_timer_running = 0;
|
||||
list_changed = SDL_TRUE;
|
||||
} else {
|
||||
SDL_SYS_StopTimer();
|
||||
SDL_timer_running = 0;
|
||||
}
|
||||
}
|
||||
if (ms) {
|
||||
if (SDL_timer_threaded) {
|
||||
if (SDL_AddTimerInternal
|
||||
(ms, callback_wrapper, (void *) callback) == NULL) {
|
||||
retval = -1;
|
||||
}
|
||||
} else {
|
||||
SDL_timer_running = 1;
|
||||
SDL_alarm_interval = ms;
|
||||
SDL_alarm_callback = callback;
|
||||
retval = SDL_SYS_StartTimer();
|
||||
}
|
||||
}
|
||||
if (SDL_timer_threaded) {
|
||||
SDL_mutexV(SDL_timer_mutex);
|
||||
}
|
||||
|
||||
return retval;
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue