diff options
Diffstat (limited to 'timer.c')
-rw-r--r-- | timer.c | 233 |
1 files changed, 120 insertions, 113 deletions
@@ -1,4 +1,4 @@ -/* $Id: timer.c,v 1.12 2005/01/18 06:30:24 reinelt Exp $ +/* $Id: timer.c,v 1.13 2005/05/08 04:32:45 reinelt Exp $ * * generic timer handling * @@ -21,6 +21,9 @@ * * * $Log: timer.c,v $ + * Revision 1.13 2005/05/08 04:32:45 reinelt + * CodingStyle added and applied + * * Revision 1.12 2005/01/18 06:30:24 reinelt * added (C) to all copyright statements * @@ -106,137 +109,141 @@ typedef struct TIMER { - void (*callback)(void *data); - void *data; - struct timeval when; - int interval; - int one_shot; - int active; + void (*callback) (void *data); + void *data; + struct timeval when; + int interval; + int one_shot; + int active; } TIMER; -TIMER *Timers=NULL; -int nTimers=0; +TIMER *Timers = NULL; +int nTimers = 0; -static void timer_inc (struct timeval *tv, const int msec) +static void timer_inc(struct timeval *tv, const int msec) { - tv->tv_sec += msec / 1000; - tv->tv_usec += (msec - 1000*(msec/1000)) * 1000; - - if (tv->tv_usec >= 1000000) { - tv->tv_usec -= 1000000; - tv->tv_sec++; - } + tv->tv_sec += msec / 1000; + tv->tv_usec += (msec - 1000 * (msec / 1000)) * 1000; + + if (tv->tv_usec >= 1000000) { + tv->tv_usec -= 1000000; + tv->tv_sec++; + } } -int timer_add (void (*callback)(void *data), void *data, const int interval, const int one_shot) +int timer_add(void (*callback) (void *data), void *data, const int interval, const int one_shot) { - int i; - struct timeval now; - - /* find a free slot */ - for (i=0; i<nTimers; i++) { - if (Timers[i].active==0) break; - } - - /* none found, allocate a new slot */ - if (i>=nTimers) { - nTimers++; - Timers=realloc(Timers, nTimers*sizeof(*Timers)); - } - - gettimeofday(&now, NULL); - - /* fill slot */ - Timers[i].callback = callback; - Timers[i].data = data; - Timers[i].when = now; - Timers[i].interval = interval; - Timers[i].one_shot = one_shot; - Timers[i].active = 1; - - /* if one-shot timer, don't fire now */ - if (one_shot) { - timer_inc (&Timers[i].when, interval); - } - - return 0; + int i; + struct timeval now; + + /* find a free slot */ + for (i = 0; i < nTimers; i++) { + if (Timers[i].active == 0) + break; + } + + /* none found, allocate a new slot */ + if (i >= nTimers) { + nTimers++; + Timers = realloc(Timers, nTimers * sizeof(*Timers)); + } + + gettimeofday(&now, NULL); + + /* fill slot */ + Timers[i].callback = callback; + Timers[i].data = data; + Timers[i].when = now; + Timers[i].interval = interval; + Timers[i].one_shot = one_shot; + Timers[i].active = 1; + + /* if one-shot timer, don't fire now */ + if (one_shot) { + timer_inc(&Timers[i].when, interval); + } + + return 0; } -int timer_process (struct timespec *delay) +int timer_process(struct timespec *delay) { - int i, flag, min; - struct timeval now; - - /* the current moment */ - gettimeofday(&now, NULL); - - /* sanity check */ - if (nTimers==0) { - error ("huh? not one single timer to process? dazed and confused..."); - return -1; - } - - /* process expired timers */ - flag=0; - for (i=0; i<nTimers; i++) { - if (Timers[i].active == 0) continue; - if (timercmp(&Timers[i].when, &now, <=)) { - flag=1; - /* callback */ - if (Timers[i].callback!=NULL) { - Timers[i].callback(Timers[i].data); - } - /* respawn or delete timer */ - if (Timers[i].one_shot) { - Timers[i].active=0; - } else { - Timers[i].when=now; - timer_inc (&Timers[i].when, Timers[i].interval); - } + int i, flag, min; + struct timeval now; + + /* the current moment */ + gettimeofday(&now, NULL); + + /* sanity check */ + if (nTimers == 0) { + error("huh? not one single timer to process? dazed and confused..."); + return -1; + } + + /* process expired timers */ + flag = 0; + for (i = 0; i < nTimers; i++) { + if (Timers[i].active == 0) + continue; + if (timercmp(&Timers[i].when, &now, <=)) { + flag = 1; + /* callback */ + if (Timers[i].callback != NULL) { + Timers[i].callback(Timers[i].data); + } + /* respawn or delete timer */ + if (Timers[i].one_shot) { + Timers[i].active = 0; + } else { + Timers[i].when = now; + timer_inc(&Timers[i].when, Timers[i].interval); + } + } + } + + /* find next timer */ + flag = 1; + min = -1; + for (i = 0; i < nTimers; i++) { + if (Timers[i].active == 0) + continue; + if (flag || timercmp(&Timers[i].when, &Timers[min].when, <)) { + flag = 0; + min = i; + } + } + + if (min < 0) { + error("huh? not one single timer left? dazed and confused..."); + return -1; } - } - - /* find next timer */ - flag=1; - min=-1; - for (i=0; i<nTimers; i++) { - if (Timers[i].active == 0) continue; - if (flag || timercmp(&Timers[i].when, &Timers[min].when, <)) { - flag=0; - min=i; + + /* delay until next timer event */ + delay->tv_sec = Timers[min].when.tv_sec - now.tv_sec; + delay->tv_nsec = Timers[min].when.tv_usec - now.tv_usec; + if (delay->tv_nsec < 0) { + delay->tv_sec--; + delay->tv_nsec += 1000000; } - } - - if (min<0) { - error ("huh? not one single timer left? dazed and confused..."); - return -1; - } - - /* delay until next timer event */ - delay->tv_sec = Timers[min].when.tv_sec - now.tv_sec; - delay->tv_nsec = Timers[min].when.tv_usec - now.tv_usec; - if (delay->tv_nsec<0) { - delay->tv_sec--; - delay->tv_nsec += 1000000; - } - /* nanoseconds!! */ - delay->tv_nsec *= 1000; - - return 0; - + /* nanoseconds!! */ + delay->tv_nsec *= 1000; + + return 0; + } -void timer_exit(void) { +void timer_exit(void) +{ - nTimers=0; + nTimers = 0; - if (Timers != NULL) { - free(Timers);; - Timers = NULL; - } + if (Timers != NULL) { + free(Timers);; + Timers = NULL; + } } |