**************************************************************************/
#include <time.h>
+#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include "timer.h"
-GSList* timeout_list = 0;
+GSList* timeout_list;
struct timeval next_timeout;
+GHashTable* multi_timeouts;
// functions and structs for multi timeouts
multi_timeout* multi_timeout;
};
+
+void default_timeout()
+{
+ timeout_list = 0;
+ multi_timeouts = 0;
+}
+
+void cleanup_timeout()
+{
+ while (timeout_list) {
+ timeout* t = timeout_list->data;
+ if (t->multi_timeout)
+ stop_multi_timeout(t);
+ free(t);
+ timeout_list = g_slist_remove(timeout_list, t);
+ }
+}
+
void add_timeout_intern(int value_msec, int interval_msec, void(*_callback)(void*), void* arg, timeout* t);
gint compare_timeouts(gconstpointer t1, gconstpointer t2);
gint compare_timespecs(const struct timespec* t1, const struct timespec* t2);
void remove_from_multi_timeout(timeout* t);
void stop_multi_timeout(timeout* t);
-GHashTable* multi_timeouts = 0;
-
/** Implementation notes for timeouts: The timeouts are kept in a GSList sorted by their
* expiration time.
* That means that update_next_timeout() only have to consider the first timeout in the list,
}
-void stop_all_timeouts()
-{
- while (timeout_list) {
- timeout* t = timeout_list->data;
- if (t->multi_timeout)
- stop_multi_timeout(t);
- free(t);
- timeout_list = g_slist_remove(timeout_list, t);
- }
-}
-
-
void add_timeout_intern(int value_msec, int interval_msec, void(*_callback)(), void* arg, timeout *t)
{
t->interval_msec = interval_msec;
t1->multi_timeout = mt1;
t2->multi_timeout = mt2;
- real_timeout->multi_timeout = real_timeout;
+ // set real_timeout->multi_timeout to something, such that we see in add_timeout_intern that
+ // it is already a multi_timeout (we never use it, except of checking for 0 ptr)
+ real_timeout->multi_timeout = (void*)real_timeout;
timeout_list = g_slist_remove(timeout_list, t1);
timeout_list = g_slist_remove(timeout_list, t2);
multi_timeout_handler* mth = g_hash_table_lookup(multi_timeouts, t);
g_hash_table_remove(multi_timeouts, mth->parent_timeout);
while (mth->timeout_list) {
- timeout* t = mth->timeout_list->data;
- mth->timeout_list = g_slist_remove(mth->timeout_list, t);
- g_hash_table_remove(multi_timeouts, t);
- free(t);
+ timeout* t1 = mth->timeout_list->data;
+ mth->timeout_list = g_slist_remove(mth->timeout_list, t1);
+ g_hash_table_remove(multi_timeouts, t1);
+ free(t1->multi_timeout);
+ free(t1);
}
free(mth);
}