X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Futil%2Ftimer.c;h=dd6847318569126796964e3caea4f70b64d0df44;hb=fc22af941cf7b9db65a703e9e697490119c70ec2;hp=b4db7f48dfa0915eec9692bbece3937781d4d63f;hpb=f8bebb561d52fa25b320904bb0c6a08347d05611;p=chaz%2Ftint2 diff --git a/src/util/timer.c b/src/util/timer.c index b4db7f4..dd68473 100644 --- a/src/util/timer.c +++ b/src/util/timer.c @@ -46,6 +46,21 @@ struct _timeout { multi_timeout* multi_timeout; }; +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); +int timespec_subtract(struct timespec* result, struct timespec* x, struct timespec* y); +struct timespec add_msec_to_timespec(struct timespec ts, int msec); + + +int align_with_existing_timeouts(timeout* t); +void create_multi_timeout(timeout* t1, timeout* t2); +void append_multi_timeout(timeout* t1, timeout* t2); +int calc_multi_timeout_interval(multi_timeout_handler* mth); +void update_multi_timeout_values(multi_timeout_handler* mth); +void callback_multi_timeout(void* mth); +void remove_from_multi_timeout(timeout* t); +void stop_multi_timeout(timeout* t); void default_timeout() { @@ -62,24 +77,12 @@ void cleanup_timeout() free(t); timeout_list = g_slist_remove(timeout_list, t); } + if (multi_timeouts) { + g_hash_table_destroy(multi_timeouts); + multi_timeouts = 0; + } } -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); -int timespec_subtract(struct timespec* result, struct timespec* x, struct timespec* y); -struct timespec add_msec_to_timespec(struct timespec ts, int msec); - - -int align_with_existing_timeouts(timeout* t); -void create_multi_timeout(timeout* t1, timeout* t2); -void append_multi_timeout(timeout* t1, timeout* t2); -int calc_multi_timeout_interval(multi_timeout_handler* mth); -void update_multi_timeout_values(multi_timeout_handler* mth); -void callback_multi_timeout(void* mth); -void remove_from_multi_timeout(timeout* t); -void stop_multi_timeout(timeout* t); - /** 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, @@ -395,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);