diff src/timer/SDL_timer.c @ 1895:c121d94672cb

SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author Sam Lantinga <slouken@libsdl.org>
date Mon, 10 Jul 2006 21:04:37 +0000
parents e02263385643
children 99210400e8b9
line wrap: on
line diff
--- a/src/timer/SDL_timer.c	Thu Jul 06 18:01:37 2006 +0000
+++ b/src/timer/SDL_timer.c	Mon Jul 10 21:04:37 2006 +0000
@@ -38,12 +38,13 @@
 /* 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 @@
 /* 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: */