summaryrefslogtreecommitdiff
path: root/src/timers.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/timers.c')
-rw-r--r--src/timers.c82
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;
}