From db8baf697889c80c0632d7cc91343c18a2647429 Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Wed, 1 Mar 2000 09:44:10 +0000 Subject: [PATCH] minor optimization. Wed Mar 1 10:39:39 2000 Tim Janik * 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 * 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 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. --- ChangeLog | 34 ++++++++++++++++++++ ChangeLog.pre-2-0 | 34 ++++++++++++++++++++ ChangeLog.pre-2-10 | 34 ++++++++++++++++++++ ChangeLog.pre-2-12 | 34 ++++++++++++++++++++ ChangeLog.pre-2-2 | 34 ++++++++++++++++++++ ChangeLog.pre-2-4 | 34 ++++++++++++++++++++ ChangeLog.pre-2-6 | 34 ++++++++++++++++++++ ChangeLog.pre-2-8 | 34 ++++++++++++++++++++ glib.h | 23 +++++++------- glib/glib.h | 23 +++++++------- glib/gmain.c | 86 ++++++++++++++++++++++++++++----------------------- glib/gnode.c | 21 +++++++++++++ glib/gslist.c | 26 ++++++---------- glib/gstrfuncs.c | 4 +-- glib/gtimer.c | 9 +++++- glib/gutils.c | 8 ++--- gmain.c | 86 ++++++++++++++++++++++++++++----------------------- gmodule/ChangeLog | 5 +++ gmodule/testgmodule.c | 29 +++++++++++++---- gnode.c | 21 +++++++++++++ gslist.c | 26 ++++++---------- gstrfuncs.c | 4 +-- gtimer.c | 9 +++++- gutils.c | 8 ++--- testglib.c | 15 +++++++-- tests/testglib.c | 15 +++++++-- 26 files changed, 528 insertions(+), 162 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9643f33..bbd5d84 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,37 @@ +Wed Mar 1 10:39:39 2000 Tim Janik + + * 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. + +Fri Jan 28 11:37:41 2000 Owen Taylor + + 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. + 2000-02-27 Tor Lillqvist * glib.def: Add new functions. diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 9643f33..bbd5d84 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,37 @@ +Wed Mar 1 10:39:39 2000 Tim Janik + + * 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. + +Fri Jan 28 11:37:41 2000 Owen Taylor + + 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. + 2000-02-27 Tor Lillqvist * glib.def: Add new functions. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 9643f33..bbd5d84 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,37 @@ +Wed Mar 1 10:39:39 2000 Tim Janik + + * 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. + +Fri Jan 28 11:37:41 2000 Owen Taylor + + 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. + 2000-02-27 Tor Lillqvist * glib.def: Add new functions. diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 9643f33..bbd5d84 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,37 @@ +Wed Mar 1 10:39:39 2000 Tim Janik + + * 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. + +Fri Jan 28 11:37:41 2000 Owen Taylor + + 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. + 2000-02-27 Tor Lillqvist * glib.def: Add new functions. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 9643f33..bbd5d84 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,37 @@ +Wed Mar 1 10:39:39 2000 Tim Janik + + * 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. + +Fri Jan 28 11:37:41 2000 Owen Taylor + + 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. + 2000-02-27 Tor Lillqvist * glib.def: Add new functions. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 9643f33..bbd5d84 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,37 @@ +Wed Mar 1 10:39:39 2000 Tim Janik + + * 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. + +Fri Jan 28 11:37:41 2000 Owen Taylor + + 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. + 2000-02-27 Tor Lillqvist * glib.def: Add new functions. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 9643f33..bbd5d84 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,37 @@ +Wed Mar 1 10:39:39 2000 Tim Janik + + * 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. + +Fri Jan 28 11:37:41 2000 Owen Taylor + + 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. + 2000-02-27 Tor Lillqvist * glib.def: Add new functions. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 9643f33..bbd5d84 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,37 @@ +Wed Mar 1 10:39:39 2000 Tim Janik + + * 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. + +Fri Jan 28 11:37:41 2000 Owen Taylor + + 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. + 2000-02-27 Tor Lillqvist * glib.def: Add new functions. diff --git a/glib.h b/glib.h index bcbb53d..463cd9a 100644 --- a/glib.h +++ b/glib.h @@ -1159,6 +1159,7 @@ void g_node_pop_allocator (void); GNode* g_node_new (gpointer data); void g_node_destroy (GNode *root); void g_node_unlink (GNode *node); +GNode* g_node_copy (GNode *node); GNode* g_node_insert (GNode *parent, gint position, GNode *node); @@ -1598,24 +1599,22 @@ gchar* g_strjoin (const gchar *separator, */ gchar* g_strcompress (const gchar *source); -/* Copy a string escaping nonprintable characters like in C strings. - * Inverse of g_strcompress. The exceptions parameter, if non-NULL, points - * to a string containing characters that are not to be escaped. - */ -gchar* g_strescape (const gchar *source, - const gchar *exceptions); -/* - * Convert between the operating system (or C runtime) +/* Convert between the operating system (or C runtime) * representation of file names and UTF-8. */ gchar* g_filename_to_utf8 (const gchar *opsysstring); gchar* g_filename_from_utf8 (const gchar *utf8string); -/* Deprecated API: - * gchar* g_strescape (const gchar *source); - * Luckily this function wasn't much used. - * Add a second NULL parameter in calls for mostly identical semantics. +/* Copy a string escaping nonprintable characters like in C strings. + * Inverse of g_strcompress. The exceptions parameter, if non-NULL, points + * to a string containing characters that are not to be escaped. + * + * Deprecated API: gchar* g_strescape (const gchar *source); + * Luckily this function wasn't used much, using NULL as second parameter + * provides mostly identical semantics. */ +gchar* g_strescape (const gchar *source, + const gchar *exceptions); gpointer g_memdup (gconstpointer mem, guint byte_size); diff --git a/glib/glib.h b/glib/glib.h index bcbb53d..463cd9a 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -1159,6 +1159,7 @@ void g_node_pop_allocator (void); GNode* g_node_new (gpointer data); void g_node_destroy (GNode *root); void g_node_unlink (GNode *node); +GNode* g_node_copy (GNode *node); GNode* g_node_insert (GNode *parent, gint position, GNode *node); @@ -1598,24 +1599,22 @@ gchar* g_strjoin (const gchar *separator, */ gchar* g_strcompress (const gchar *source); -/* Copy a string escaping nonprintable characters like in C strings. - * Inverse of g_strcompress. The exceptions parameter, if non-NULL, points - * to a string containing characters that are not to be escaped. - */ -gchar* g_strescape (const gchar *source, - const gchar *exceptions); -/* - * Convert between the operating system (or C runtime) +/* Convert between the operating system (or C runtime) * representation of file names and UTF-8. */ gchar* g_filename_to_utf8 (const gchar *opsysstring); gchar* g_filename_from_utf8 (const gchar *utf8string); -/* Deprecated API: - * gchar* g_strescape (const gchar *source); - * Luckily this function wasn't much used. - * Add a second NULL parameter in calls for mostly identical semantics. +/* Copy a string escaping nonprintable characters like in C strings. + * Inverse of g_strcompress. The exceptions parameter, if non-NULL, points + * to a string containing characters that are not to be escaped. + * + * Deprecated API: gchar* g_strescape (const gchar *source); + * Luckily this function wasn't used much, using NULL as second parameter + * provides mostly identical semantics. */ +gchar* g_strescape (const gchar *source, + const gchar *exceptions); gpointer g_memdup (gconstpointer mem, guint byte_size); diff --git a/glib/gmain.c b/glib/gmain.c index a16021b..a3b1834 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -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); } diff --git a/glib/gnode.c b/glib/gnode.c index 5145c6b..5db03c6 100644 --- a/glib/gnode.c +++ b/glib/gnode.c @@ -190,6 +190,24 @@ g_node_unlink (GNode *node) } GNode* +g_node_copy (GNode *node) +{ + GNode *new_node = NULL; + + if (node) + { + GNode *child; + + new_node = g_node_new (node->data); + + for (child = g_node_last_child (node); child; child = child->prev) + g_node_prepend (new_node, g_node_copy (child)); + } + + return new_node; +} + +GNode* g_node_insert (GNode *parent, gint position, GNode *node) @@ -917,6 +935,9 @@ g_node_first_sibling (GNode *node) { g_return_val_if_fail (node != NULL, NULL); + if (node->parent) + return node->parent->children; + while (node->prev) node = node->prev; diff --git a/glib/gslist.c b/glib/gslist.c index 9e7c88f..2f01673 100644 --- a/glib/gslist.c +++ b/glib/gslist.c @@ -377,32 +377,26 @@ g_slist_copy (GSList *list) GSList* g_slist_reverse (GSList *list) { - GSList *tmp; - GSList *prev; - GSList *last; - - last = NULL; - prev = NULL; - + GSList *prev = NULL; + GSList *next = NULL; + while (list) { - last = list; - - tmp = list->next; + next = list->next; list->next = prev; - + prev = list; - list = tmp; + list = next; } - - return last; + + return prev; } GSList* g_slist_nth (GSList *list, guint n) { - while ((n-- > 0) && list) + while (n-- > 0 && list) list = list->next; return list; @@ -412,7 +406,7 @@ gpointer g_slist_nth_data (GSList *list, guint n) { - while ((n-- > 0) && list) + while (n-- > 0 && list) list = list->next; return list ? list->data : NULL; diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 6df7757..927aca5 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -1291,8 +1291,6 @@ g_filename_from_utf8 (const gchar *utf8string) #endif } - -/* blame Elliot for these next five routines */ gchar* g_strchug (gchar *string) { @@ -1303,7 +1301,7 @@ g_strchug (gchar *string) for (start = string; *start && isspace (*start); start++) ; - g_memmove(string, start, strlen(start) + 1); + g_memmove (string, start, strlen( start) + 1); return string; } diff --git a/glib/gtimer.c b/glib/gtimer.c index 6850e58..d613a50 100644 --- a/glib/gtimer.c +++ b/glib/gtimer.c @@ -184,9 +184,16 @@ g_timer_elapsed (GTimer *timer, elapsed.tv_sec = rtimer->end.tv_sec - rtimer->start.tv_sec; total = elapsed.tv_sec + ((gdouble) elapsed.tv_usec / 1e6); + if (total < 0) + { + total = 0; - if (microseconds) + if (microseconds) + *microseconds = 0; + } + else if (microseconds) *microseconds = elapsed.tv_usec; + #endif /* !G_OS_WIN32 */ return total; diff --git a/glib/gutils.c b/glib/gutils.c index 0ec887a..62b4e54 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -515,8 +515,8 @@ g_get_any_init (void) */ if (error == 0 || error == ENOENT) { - g_warning ("getpwuid_r(): failed due to: " - "No such user: %lu.", (unsigned long)getuid ()); + g_warning ("getpwuid_r(): failed due to unknown user id (%lu)", + (gulong) getuid ()); break; } if (bufsize > 32 * 1024) @@ -541,11 +541,7 @@ g_get_any_init (void) if (pw) { g_user_name = g_strdup (pw->pw_name); -#ifdef HAVE_PW_GECOS g_real_name = g_strdup (pw->pw_gecos); -#else - g_real_name = g_strdup (g_user_name); -#endif if (!g_home_dir) g_home_dir = g_strdup (pw->pw_dir); } diff --git a/gmain.c b/gmain.c index a16021b..a3b1834 100644 --- a/gmain.c +++ b/gmain.c @@ -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); } diff --git a/gmodule/ChangeLog b/gmodule/ChangeLog index f37adc1..2095d83 100644 --- a/gmodule/ChangeLog +++ b/gmodule/ChangeLog @@ -22,6 +22,11 @@ Wed Mar 1 05:34:47 2000 Tim Janik * merges from glib-1-2. +Sat Feb 19 19:43:29 2000 Tim Janik + + * testgmodule.c (main): added test to check that not yet bound symbols + in shared libraries of the main module are retrievable, from David Gero. + 2000-01-13 Martin Baulig * gmodule.c (g_module_open): Check whether `check_init' is not NULL diff --git a/gmodule/testgmodule.c b/gmodule/testgmodule.c index 42c28e6..70ebe2d 100644 --- a/gmodule/testgmodule.c +++ b/gmodule/testgmodule.c @@ -26,6 +26,7 @@ #undef G_LOG_DOMAIN #include +#include "gmoduleconf.h" G_MODULE_EXPORT void @@ -37,7 +38,7 @@ g_clash_func (void) typedef void (*SimpleFunc) (void); typedef void (*GModuleFunc) (GModule *); -SimpleFunc gplugin_clash_func; +static SimpleFunc plugin_clash_func = NULL; int main (int arg, @@ -55,7 +56,10 @@ main (int arg, #ifdef G_OS_WIN32 plugin_a = g_strconcat (string, "\\libgplugin_a.dll", NULL); plugin_b = g_strconcat (string, "\\libgplugin_b.dll", NULL); -#else /* !G_OS_WIN32 */ +#elif (G_MODULE_IMPL == G_MODULE_IMPL_DLD) + plugin_a = g_strconcat (string, "/.libs/", "libgplugin_a.sl", NULL); + plugin_b = g_strconcat (string, "/.libs/", "libgplugin_b.sl", NULL); +#else /* G_MODULE_IMPL != G_MODULE_IMPL_DLD && !G_OS_WIN32 */ plugin_a = g_strconcat (string, "/.libs/", "libgplugin_a.so", NULL); plugin_b = g_strconcat (string, "/.libs/", "libgplugin_b.so", NULL); #endif /* G_OS_WIN32 */ @@ -70,6 +74,15 @@ main (int arg, g_print ("error: %s\n", g_module_error ()); return 1; } + g_print ("check that not yet bound symbols in shared libraries of main module are retrievable:\n"); + string = "g_module_close"; + g_print ("retrive symbol `%s' from \"%s\":\n", string, g_basename (g_module_name (module_self))); + if (!g_module_symbol (module_self, string, (gpointer) &f_self)) + { + g_print ("error: %s\n", g_module_error ()); + return 1; + } + g_print ("retrived symbol `%s' as %p\n", string, f_self); g_print ("load plugin from \"%s\"\n", plugin_a); module_a = g_module_open (plugin_a, G_MODULE_BIND_LAZY); if (!module_a) @@ -137,6 +150,10 @@ main (int arg, /* get and call clashing plugin functions */ string = "gplugin_clash_func"; + g_print ("retrive symbol `%s' from \"%s\"\n", string, g_basename (g_module_name (module_self))); + if (!g_module_symbol (module_self, string, (gpointer) &f_self)) + f_self = NULL; + g_print ("retrived function `%s' from self: %p\n", string, f_self); g_print ("retrive symbol `%s' from \"%s\"\n", string, g_basename (g_module_name (module_a))); if (!g_module_symbol (module_a, string, (gpointer) &f_a)) { @@ -150,11 +167,11 @@ main (int arg, return 1; } g_print ("call plugin function(%p) A: ", f_a); - gplugin_clash_func = f_a; - gplugin_clash_func (); + plugin_clash_func = f_a; + plugin_clash_func (); g_print ("call plugin function(%p) B: ", f_b); - gplugin_clash_func = f_b; - gplugin_clash_func (); + plugin_clash_func = f_b; + plugin_clash_func (); /* call gmodule function form A */ diff --git a/gnode.c b/gnode.c index 5145c6b..5db03c6 100644 --- a/gnode.c +++ b/gnode.c @@ -190,6 +190,24 @@ g_node_unlink (GNode *node) } GNode* +g_node_copy (GNode *node) +{ + GNode *new_node = NULL; + + if (node) + { + GNode *child; + + new_node = g_node_new (node->data); + + for (child = g_node_last_child (node); child; child = child->prev) + g_node_prepend (new_node, g_node_copy (child)); + } + + return new_node; +} + +GNode* g_node_insert (GNode *parent, gint position, GNode *node) @@ -917,6 +935,9 @@ g_node_first_sibling (GNode *node) { g_return_val_if_fail (node != NULL, NULL); + if (node->parent) + return node->parent->children; + while (node->prev) node = node->prev; diff --git a/gslist.c b/gslist.c index 9e7c88f..2f01673 100644 --- a/gslist.c +++ b/gslist.c @@ -377,32 +377,26 @@ g_slist_copy (GSList *list) GSList* g_slist_reverse (GSList *list) { - GSList *tmp; - GSList *prev; - GSList *last; - - last = NULL; - prev = NULL; - + GSList *prev = NULL; + GSList *next = NULL; + while (list) { - last = list; - - tmp = list->next; + next = list->next; list->next = prev; - + prev = list; - list = tmp; + list = next; } - - return last; + + return prev; } GSList* g_slist_nth (GSList *list, guint n) { - while ((n-- > 0) && list) + while (n-- > 0 && list) list = list->next; return list; @@ -412,7 +406,7 @@ gpointer g_slist_nth_data (GSList *list, guint n) { - while ((n-- > 0) && list) + while (n-- > 0 && list) list = list->next; return list ? list->data : NULL; diff --git a/gstrfuncs.c b/gstrfuncs.c index 6df7757..927aca5 100644 --- a/gstrfuncs.c +++ b/gstrfuncs.c @@ -1291,8 +1291,6 @@ g_filename_from_utf8 (const gchar *utf8string) #endif } - -/* blame Elliot for these next five routines */ gchar* g_strchug (gchar *string) { @@ -1303,7 +1301,7 @@ g_strchug (gchar *string) for (start = string; *start && isspace (*start); start++) ; - g_memmove(string, start, strlen(start) + 1); + g_memmove (string, start, strlen( start) + 1); return string; } diff --git a/gtimer.c b/gtimer.c index 6850e58..d613a50 100644 --- a/gtimer.c +++ b/gtimer.c @@ -184,9 +184,16 @@ g_timer_elapsed (GTimer *timer, elapsed.tv_sec = rtimer->end.tv_sec - rtimer->start.tv_sec; total = elapsed.tv_sec + ((gdouble) elapsed.tv_usec / 1e6); + if (total < 0) + { + total = 0; - if (microseconds) + if (microseconds) + *microseconds = 0; + } + else if (microseconds) *microseconds = elapsed.tv_usec; + #endif /* !G_OS_WIN32 */ return total; diff --git a/gutils.c b/gutils.c index 0ec887a..62b4e54 100644 --- a/gutils.c +++ b/gutils.c @@ -515,8 +515,8 @@ g_get_any_init (void) */ if (error == 0 || error == ENOENT) { - g_warning ("getpwuid_r(): failed due to: " - "No such user: %lu.", (unsigned long)getuid ()); + g_warning ("getpwuid_r(): failed due to unknown user id (%lu)", + (gulong) getuid ()); break; } if (bufsize > 32 * 1024) @@ -541,11 +541,7 @@ g_get_any_init (void) if (pw) { g_user_name = g_strdup (pw->pw_name); -#ifdef HAVE_PW_GECOS g_real_name = g_strdup (pw->pw_gecos); -#else - g_real_name = g_strdup (g_user_name); -#endif if (!g_home_dir) g_home_dir = g_strdup (pw->pw_dir); } diff --git a/testglib.c b/testglib.c index 1d14971..940851b 100644 --- a/testglib.c +++ b/testglib.c @@ -77,7 +77,7 @@ g_node_test (void) GNode *node_G; GNode *node_J; guint i; - gchar *tstring; + gchar *tstring, *cstring; g_print ("checking n-way trees: "); failed = FALSE; @@ -165,7 +165,18 @@ g_node_test (void) g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); TEST (tstring, strcmp (tstring, "ABFEDCGKJIH") == 0); g_free (tstring); tstring = NULL; - + + cstring = NULL; + node = g_node_copy (root); + TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == g_node_n_nodes (node, G_TRAVERSE_ALL)); + TEST (NULL, g_node_max_height (root) == g_node_max_height (node)); + g_node_traverse (root, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + g_node_traverse (node, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &cstring); + TEST (cstring, strcmp (tstring, cstring) == 0); + g_free (tstring); tstring = NULL; + g_free (cstring); cstring = NULL; + g_node_destroy (node); + g_node_destroy (root); /* allocation tests */ diff --git a/tests/testglib.c b/tests/testglib.c index 1d14971..940851b 100644 --- a/tests/testglib.c +++ b/tests/testglib.c @@ -77,7 +77,7 @@ g_node_test (void) GNode *node_G; GNode *node_J; guint i; - gchar *tstring; + gchar *tstring, *cstring; g_print ("checking n-way trees: "); failed = FALSE; @@ -165,7 +165,18 @@ g_node_test (void) g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); TEST (tstring, strcmp (tstring, "ABFEDCGKJIH") == 0); g_free (tstring); tstring = NULL; - + + cstring = NULL; + node = g_node_copy (root); + TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == g_node_n_nodes (node, G_TRAVERSE_ALL)); + TEST (NULL, g_node_max_height (root) == g_node_max_height (node)); + g_node_traverse (root, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + g_node_traverse (node, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &cstring); + TEST (cstring, strcmp (tstring, cstring) == 0); + g_free (tstring); tstring = NULL; + g_free (cstring); cstring = NULL; + g_node_destroy (node); + g_node_destroy (root); /* allocation tests */ -- 2.7.4