X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Futil%2Ftimer.c;h=dd6847318569126796964e3caea4f70b64d0df44;hb=fc22af941cf7b9db65a703e9e697490119c70ec2;hp=e7222524fcce8703abc55285308f9113f1c09750;hpb=bab0811f845cedb817a3c3a29dd91ade07d5a886;p=chaz%2Ftint2 diff --git a/src/util/timer.c b/src/util/timer.c index e722252..dd68473 100644 --- a/src/util/timer.c +++ b/src/util/timer.c @@ -16,13 +16,15 @@ **************************************************************************/ #include +#include #include #include #include "timer.h" -GSList* timeout_list = 0; +GSList* timeout_list; struct timeval next_timeout; +GHashTable* multi_timeouts; // functions and structs for multi timeouts @@ -60,7 +62,26 @@ void callback_multi_timeout(void* mth); 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. @@ -155,18 +176,6 @@ void stop_timeout(timeout* t) } -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; @@ -300,7 +309,9 @@ void create_multi_timeout(timeout* t1, timeout* t2) 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); @@ -387,6 +398,7 @@ void remove_from_multi_timeout(timeout* t) if (g_slist_length(mth->timeout_list) == 1) { timeout* last_timeout = mth->timeout_list->data; + 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); @@ -411,10 +423,11 @@ void stop_multi_timeout(timeout* t) 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); }