+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.
+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.
+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.
+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.
+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.
+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.
+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.
+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.
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);
*/
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);
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);
*/
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);
/* 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
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)
{
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);
}
}
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)
{
g_return_val_if_fail (node != NULL, NULL);
+ if (node->parent)
+ return node->parent->children;
+
while (node->prev)
node = node->prev;
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;
g_slist_nth_data (GSList *list,
guint n)
{
- while ((n-- > 0) && list)
+ while (n-- > 0 && list)
list = list->next;
return list ? list->data : NULL;
#endif
}
-
-/* blame Elliot for these next five routines */
gchar*
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;
}
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;
*/
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)
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);
}
/* 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
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)
{
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);
}
* 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
#undef G_LOG_DOMAIN
#include <gmodule.h>
+#include "gmoduleconf.h"
G_MODULE_EXPORT void
typedef void (*SimpleFunc) (void);
typedef void (*GModuleFunc) (GModule *);
-SimpleFunc gplugin_clash_func;
+static SimpleFunc plugin_clash_func = NULL;
int
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 */
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)
/* 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))
{
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
*/
}
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)
{
g_return_val_if_fail (node != NULL, NULL);
+ if (node->parent)
+ return node->parent->children;
+
while (node->prev)
node = node->prev;
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;
g_slist_nth_data (GSList *list,
guint n)
{
- while ((n-- > 0) && list)
+ while (n-- > 0 && list)
list = list->next;
return list ? list->data : NULL;
#endif
}
-
-/* blame Elliot for these next five routines */
gchar*
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;
}
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;
*/
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)
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);
}
GNode *node_G;
GNode *node_J;
guint i;
- gchar *tstring;
+ gchar *tstring, *cstring;
g_print ("checking n-way trees: ");
failed = FALSE;
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 */
GNode *node_G;
GNode *node_J;
guint i;
- gchar *tstring;
+ gchar *tstring, *cstring;
g_print ("checking n-way trees: ");
failed = FALSE;
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 */