**************************************************************************/
#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
void remove_from_multi_timeout(timeout* t);
void stop_multi_timeout(timeout* t);
-GHashTable* multi_timeouts = 0;
+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);
+ }
+ if (multi_timeouts) {
+ g_hash_table_destroy(multi_timeouts);
+ multi_timeouts = 0;
+ }
+}
/** Implementation notes for timeouts: The timeouts are kept in a GSList sorted by their
* expiration time.
}
-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);
if (g_slist_length(mth->timeout_list) == 1) {
timeout* last_timeout = mth->timeout_list->data;
+ mth->timeout_list = g_slist_remove(mth->timeout_list, last_timeout);
free(last_timeout->multi_timeout);
last_timeout->multi_timeout = 0;
g_hash_table_remove(multi_timeouts, last_timeout);
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);
}