diff options
Diffstat (limited to 'src/timers.c')
-rw-r--r-- | src/timers.c | 82 |
1 files changed, 54 insertions, 28 deletions
diff --git a/src/timers.c b/src/timers.c index 710d2ab..8e42050 100644 --- a/src/timers.c +++ b/src/timers.c @@ -1,6 +1,7 @@ /* timers.c Copyright (C) 1999-2003 Tom Gilbert. +Copyright (C) 2010-2020 Birte Kristina Friesel. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to @@ -33,45 +34,72 @@ void feh_handle_timer(void) { fehtimer ft; - D_ENTER(4); if (!first_timer) { - D(3, ("No timer to handle, returning\n")); - D_RETURN_(4); + D(("No timer to handle, returning\n")); + return; } ft = first_timer; first_timer = first_timer->next; - D(3, ("Executing timer function now\n")); + D(("Executing timer function now\n")); (*(ft->func)) (ft->data); - D(3, ("Freeing the timer\n")); + D(("Freeing the timer\n")); if (ft && ft->name) free(ft->name); if (ft) free(ft); - D_RETURN_(4); + return; } double feh_get_time(void) { struct timeval timev; - D_ENTER(4); gettimeofday(&timev, NULL); - D_RETURN(4, (double) timev.tv_sec + (((double) timev.tv_usec) / 1000000)); + return((double) timev.tv_sec + (((double) timev.tv_usec) / 1000000)); } -void feh_remove_timer(char *name) +void feh_remove_timer_by_data(void *data) { fehtimer ft, ptr, pptr; - D_ENTER(4); - D(3, ("removing %s\n", name)); + D(("removing timer for %p\n", data)); pptr = NULL; ptr = first_timer; while (ptr) { - D(3, ("Stepping through event list\n")); + D(("Stepping through event list\n")); + ft = ptr; + if (ft->data == data) { + D(("Found it. Removing\n")); + if (pptr) + pptr->next = ft->next; + else + first_timer = ft->next; + if (ft->next) + ft->next->in += ft->in; + if (ft->name) + free(ft->name); + if (ft) + free(ft); + return; + } + pptr = ptr; + ptr = ptr->next; + } + return; +} + +static void feh_remove_timer(char *name) +{ + fehtimer ft, ptr, pptr; + + D(("removing %s\n", name)); + pptr = NULL; + ptr = first_timer; + while (ptr) { + D(("Stepping through event list\n")); ft = ptr; if (!strcmp(ft->name, name)) { - D(3, ("Found it. Removing\n")); + D(("Found it. Removing\n")); if (pptr) pptr->next = ft->next; else @@ -82,36 +110,35 @@ void feh_remove_timer(char *name) free(ft->name); if (ft) free(ft); - D_RETURN_(4); + return; } pptr = ptr; ptr = ptr->next; } - D_RETURN_(4); + return; } + void feh_add_timer(void (*func) (void *data), void *data, double in, char *name) { fehtimer ft, ptr, pptr; double tally; - D_ENTER(4); - D(3, ("adding timer %s for %f seconds time\n", name, in)); + D(("adding timer %s for %f seconds time\n", name, in)); feh_remove_timer(name); - ft = malloc(sizeof(_fehtimer)); + ft = emalloc(sizeof(_fehtimer)); ft->next = NULL; ft->func = func; ft->data = data; ft->name = estrdup(name); ft->just_added = 1; ft->in = in; - D(3, ("ft->in = %f\n", ft->in)); - tally = 0.0; + D(("ft->in = %f\n", ft->in)); if (!first_timer) { - D(3, ("No first timer\n")); + D(("No first timer\n")); first_timer = ft; } else { - D(3, ("There is a first timer\n")); + D(("There is a first timer\n")); pptr = NULL; ptr = first_timer; tally = 0.0; @@ -127,7 +154,7 @@ void feh_add_timer(void (*func) (void *data), void *data, double in, char *name) ft->in -= tally; if (ft->next) ft->next->in -= ft->in; - D_RETURN_(4); + return; } pptr = ptr; ptr = ptr->next; @@ -138,8 +165,8 @@ void feh_add_timer(void (*func) (void *data), void *data, double in, char *name) first_timer = ft; ft->in -= tally; } - D(3, ("ft->in = %f\n", ft->in)); - D_RETURN_(4); + D(("ft->in = %f\n", ft->in)); + return; } void feh_add_unique_timer(void (*func) (void *data), void *data, double in) @@ -147,13 +174,12 @@ void feh_add_unique_timer(void (*func) (void *data), void *data, double in) static long i = 0; char evname[20]; - D_ENTER(4); snprintf(evname, sizeof(evname), "T_%ld", i); - D(4, ("adding timer with unique name %s\n", evname)); + D(("adding timer with unique name %s\n", evname)); feh_add_timer(func, data, in, evname); i++; /* Mega paranoia ;) */ if (i > 1000000) i = 0; - D_RETURN_(4); + return; } |