]> Dogcows Code - chaz/tint2/blobdiff - src/util/timer.c
*fix* warning
[chaz/tint2] / src / util / timer.c
index e7222524fcce8703abc55285308f9113f1c09750..9f7ca0d65c85713e9d951e7facf4cd14eefef65d 100644 (file)
 **************************************************************************/
 
 #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
@@ -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;
+               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);
@@ -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);
 }
This page took 0.027154 seconds and 4 git commands to generate.