diff options
author | Tim Janik <timj@gtk.org> | 2000-03-01 09:44:10 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 2000-03-01 09:44:10 +0000 |
commit | db8baf697889c80c0632d7cc91343c18a2647429 (patch) | |
tree | 0c33983550e73a88b4aa2d7f09bc905cf3e4c0b5 /gmain.c | |
parent | d568a76ae4976e0aa01e26e868121a07b4e91338 (diff) | |
download | glib-db8baf697889c80c0632d7cc91343c18a2647429.tar.gz |
minor optimization.
Wed Mar 1 10:39:39 2000 Tim Janik <timj@gtk.org>
* gslist.c (g_slist_reverse): minor optimization.
* testglib.c (g_node_test): added a couple of tests for
g_node_copy().
* glib.h:
* gnode.c (g_node_copy): new function to copy subtrees,
supplied by dbsears@ix.netcom.com.
changed iterator to walk the children list backwards, so
we get down from O(n^2) to O(n).
* gnode.c (g_node_first_sibling): applied patch from
dbsears@ix.netcom.com to optimize access if node->parent
is present.
* gutils.c (g_get_any_init): backed out HAVE_PW_GECOS check around
assignment of g_real_name, sicne HAVE_PW_GECOS is never defined and
thus breaks the original code.
* merged changes from 1.2.7.
Sat Feb 19 19:43:29 2000 Tim Janik <timj@gtk.org>
* testgmodule.c (main): added test to check that not yet bound symbols
in shared libraries of the main module are retrievable, from David Gero.
Fri Jan 28 11:37:41 2000 Owen Taylor <otaylor@redhat.com>
Bug #4156 - Changes vaguely modelled after Scott Gifford's patch
* gtimer.c (g_timer_elapsed): Never report negative times -
clip times to 0.
* gmain.c (g_timeout_prepare): Guard against unexpected
clock shifts by never setting a timeout of more than
data->interval msecs.
Diffstat (limited to 'gmain.c')
-rw-r--r-- | gmain.c | 86 |
1 files changed, 48 insertions, 38 deletions
@@ -1236,21 +1236,49 @@ g_main_wakeup (void) /* Timeouts */ -static gboolean -g_timeout_prepare (gpointer source_data, +static void +g_timeout_set_expiration (GTimeoutData *data, + GTimeVal *current_time) +{ + guint seconds = data->interval / 1000; + guint msecs = data->interval - seconds * 1000; + + data->expiration.tv_sec = current_time->tv_sec + seconds; + data->expiration.tv_usec = current_time->tv_usec + msecs * 1000; + if (data->expiration.tv_usec >= 1000000) + { + data->expiration.tv_usec -= 1000000; + data->expiration.tv_sec++; + } +} + +static gboolean +g_timeout_prepare (gpointer source_data, GTimeVal *current_time, gint *timeout, gpointer user_data) { glong msec; GTimeoutData *data = source_data; - - msec = (data->expiration.tv_sec - current_time->tv_sec) * 1000 + - (data->expiration.tv_usec - current_time->tv_usec) / 1000; - - *timeout = (msec <= 0) ? 0 : msec; - - return (msec <= 0); + + msec = ((data->expiration.tv_sec - current_time->tv_sec) * 1000 + + (data->expiration.tv_usec - current_time->tv_usec) / 1000); + + if (msec < 0) + msec = 0; + else if (msec > data->interval) + { + /* The system time has been set backwards, so we + * reset the expiration time to now + data->interval; + * this at least avoids hanging for long periods of time. + */ + g_timeout_set_expiration (data, current_time); + msec = data->interval; + } + + *timeout = msec; + + return msec == 0; } static gboolean @@ -1259,14 +1287,14 @@ g_timeout_check (gpointer source_data, gpointer user_data) { GTimeoutData *data = source_data; - - return (data->expiration.tv_sec < current_time->tv_sec) || - ((data->expiration.tv_sec == current_time->tv_sec) && - (data->expiration.tv_usec <= current_time->tv_usec)); + + return ((data->expiration.tv_sec < current_time->tv_sec) || + ((data->expiration.tv_sec == current_time->tv_sec) && + (data->expiration.tv_usec <= current_time->tv_usec))); } static gboolean -g_timeout_dispatch (gpointer source_data, +g_timeout_dispatch (gpointer source_data, GTimeVal *dispatch_time, gpointer user_data) { @@ -1274,47 +1302,29 @@ g_timeout_dispatch (gpointer source_data, if (data->callback (user_data)) { - guint seconds = data->interval / 1000; - guint msecs = data->interval - seconds * 1000; + g_timeout_set_expiration (data, dispatch_time); - data->expiration.tv_sec = dispatch_time->tv_sec + seconds; - data->expiration.tv_usec = dispatch_time->tv_usec + msecs * 1000; - if (data->expiration.tv_usec >= 1000000) - { - data->expiration.tv_usec -= 1000000; - data->expiration.tv_sec++; - } return TRUE; } else return FALSE; } -guint +guint g_timeout_add_full (gint priority, - guint interval, + guint interval, GSourceFunc function, gpointer data, GDestroyNotify notify) { - guint seconds; - guint msecs; GTimeoutData *timeout_data = g_new (GTimeoutData, 1); + GTimeVal current_time; timeout_data->interval = interval; timeout_data->callback = function; - g_get_current_time (&timeout_data->expiration); - - seconds = timeout_data->interval / 1000; - msecs = timeout_data->interval - seconds * 1000; + g_get_current_time (¤t_time); - timeout_data->expiration.tv_sec += seconds; - timeout_data->expiration.tv_usec += msecs * 1000; - if (timeout_data->expiration.tv_usec >= 1000000) - { - timeout_data->expiration.tv_usec -= 1000000; - timeout_data->expiration.tv_sec++; - } + g_timeout_set_expiration (timeout_data, ¤t_time); return g_source_add (priority, FALSE, &timeout_funcs, timeout_data, data, notify); } |