minor optimization.
authorTim Janik <timj@gtk.org>
Wed, 1 Mar 2000 09:44:10 +0000 (09:44 +0000)
committerTim Janik <timj@src.gnome.org>
Wed, 1 Mar 2000 09:44:10 +0000 (09:44 +0000)
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.

26 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
glib.h
glib/glib.h
glib/gmain.c
glib/gnode.c
glib/gslist.c
glib/gstrfuncs.c
glib/gtimer.c
glib/gutils.c
gmain.c
gmodule/ChangeLog
gmodule/testgmodule.c
gnode.c
gslist.c
gstrfuncs.c
gtimer.c
gutils.c
testglib.c
tests/testglib.c

index 9643f33..bbd5d84 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,37 @@
+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.
+
+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.
+
 2000-02-27  Tor Lillqvist  <tml@iki.fi>
 
        * glib.def: Add new functions.
index 9643f33..bbd5d84 100644 (file)
@@ -1,3 +1,37 @@
+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.
+
+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.
+
 2000-02-27  Tor Lillqvist  <tml@iki.fi>
 
        * glib.def: Add new functions.
index 9643f33..bbd5d84 100644 (file)
@@ -1,3 +1,37 @@
+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.
+
+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.
+
 2000-02-27  Tor Lillqvist  <tml@iki.fi>
 
        * glib.def: Add new functions.
index 9643f33..bbd5d84 100644 (file)
@@ -1,3 +1,37 @@
+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.
+
+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.
+
 2000-02-27  Tor Lillqvist  <tml@iki.fi>
 
        * glib.def: Add new functions.
index 9643f33..bbd5d84 100644 (file)
@@ -1,3 +1,37 @@
+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.
+
+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.
+
 2000-02-27  Tor Lillqvist  <tml@iki.fi>
 
        * glib.def: Add new functions.
index 9643f33..bbd5d84 100644 (file)
@@ -1,3 +1,37 @@
+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.
+
+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.
+
 2000-02-27  Tor Lillqvist  <tml@iki.fi>
 
        * glib.def: Add new functions.
index 9643f33..bbd5d84 100644 (file)
@@ -1,3 +1,37 @@
+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.
+
+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.
+
 2000-02-27  Tor Lillqvist  <tml@iki.fi>
 
        * glib.def: Add new functions.
index 9643f33..bbd5d84 100644 (file)
@@ -1,3 +1,37 @@
+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.
+
+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.
+
 2000-02-27  Tor Lillqvist  <tml@iki.fi>
 
        * glib.def: Add new functions.
diff --git a/glib.h b/glib.h
index bcbb53d..463cd9a 100644 (file)
--- 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);
index bcbb53d..463cd9a 100644 (file)
@@ -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);
index a16021b..a3b1834 100644 (file)
@@ -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 (&current_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, &current_time);
 
   return g_source_add (priority, FALSE, &timeout_funcs, timeout_data, data, notify);
 }
index 5145c6b..5db03c6 100644 (file)
@@ -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;
   
index 9e7c88f..2f01673 100644 (file)
@@ -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;
index 6df7757..927aca5 100644 (file)
@@ -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;
 }
index 6850e58..d613a50 100644 (file)
@@ -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;
index 0ec887a..62b4e54 100644 (file)
@@ -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 (file)
--- 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 (&current_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, &current_time);
 
   return g_source_add (priority, FALSE, &timeout_funcs, timeout_data, data, notify);
 }
index f37adc1..2095d83 100644 (file)
@@ -22,6 +22,11 @@ Wed Mar  1 05:34:47 2000  Tim Janik  <timj@gtk.org>
 
        * merges from glib-1-2.
 
+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.
+
 2000-01-13  Martin Baulig  <martin@home-of-linux.org>
 
        * gmodule.c (g_module_open): Check whether `check_init' is not NULL
index 42c28e6..70ebe2d 100644 (file)
@@ -26,6 +26,7 @@
 
 #undef G_LOG_DOMAIN
 #include       <gmodule.h>
+#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 (file)
--- 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;
   
index 9e7c88f..2f01673 100644 (file)
--- 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;
index 6df7757..927aca5 100644 (file)
@@ -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;
 }
index 6850e58..d613a50 100644 (file)
--- 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;
index 0ec887a..62b4e54 100644 (file)
--- 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);
          }
index 1d14971..940851b 100644 (file)
@@ -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 */
index 1d14971..940851b 100644 (file)
@@ -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 */