Avoiding mallocs in g_log_default_handler()
- From: Owen Taylor <otaylor redhat com>
- To: gtk-devel-list gnome org
- Subject: Avoiding mallocs in g_log_default_handler()
- Date: 10 May 2001 23:38:10 -0400
As Tim suggested to me on IRC, here is a change to avoid malloc and
the use of stdio in g_log_default_handler().
It may make error reporting in out-of-memory situations a bit more
robust.
Regards,
Owen
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/glib/ChangeLog,v
retrieving revision 1.689
diff -u -r1.689 ChangeLog
--- ChangeLog 2001/05/10 13:58:38 1.689
+++ ChangeLog 2001/05/11 03:29:05
@@ -1,3 +1,13 @@
+Thu May 10 23:21:30 2001 Owen Taylor <otaylor redhat com>
+
+ * gmessages.c (g_log_write_prefix): Avoid using stderr
+ to be as robust as possible in out-of-memory.
+
+ * gmessages.c (g_log_default_handler): Remove some dead
+ code.
+
+ * gutils.c (g_parse_debug_string): Fix to avoid mallocs.
+
Thu May 10 15:19:01 2001 Tim Janik <timj gtk org>
* gscanner.c (g_scanner_key_hash): use g_str_hash() algorithm
Index: gmessages.c
===================================================================
RCS file: /cvs/gnome/glib/gmessages.c,v
retrieving revision 1.26
diff -u -r1.26 gmessages.c
--- gmessages.c 2001/05/09 16:36:17 1.26
+++ gmessages.c 2001/05/11 03:29:05
@@ -151,6 +151,59 @@
#endif
static void
+write_unsigned (gint fd,
+ gulong num,
+ guint radix)
+{
+ char buffer[64];
+ gulong tmp;
+ char c;
+ int i, n;
+
+ g_return_if_fail (radix >= 2 && radix <= 36);
+
+ if (!num)
+ {
+ write (fd, "0", 1);
+ return;
+ }
+
+ if (radix == 16)
+ write (fd, "0x", 2);
+ else if (radix == 8)
+ write (fd, "0", 1);
+
+ n = 0;
+ tmp = num;
+ while (tmp)
+ {
+ tmp /= radix;
+ n++;
+ }
+
+ i = n;
+ while (num)
+ {
+ i--;
+ c = (num % radix);
+ if (c < 10)
+ buffer[i] = c + '0';
+ else
+ buffer[i] = c + 'a' - 10;
+ num /= radix;
+ }
+
+ write (fd, buffer, n);
+}
+
+static void
+write_string (gint fd,
+ gchar *string)
+{
+ write (fd, string, strlen (string));
+}
+
+static void
g_log_write_prefix (gint fd,
GLogLevelFlags mask)
{
@@ -185,20 +238,20 @@
if ((g_log_msg_prefix & mask) == mask)
{
- gchar prg_pid[64], *prg_name;
+ gchar *prg_name;
prg_name = g_get_prgname ();
-
+
if (!prg_name)
- {
- prg_name = "(process";
- sprintf (prg_pid, ":%u): ", getpid ());
- }
+ write_string (fd, "(process:");
else
- sprintf (prg_pid, " (pid:%u): ", getpid ());
-
- write (fd, prg_name, strlen (prg_name));
- write (fd, prg_pid, strlen (prg_pid));
+ {
+ write_string (fd, prg_name);
+ write_string (fd, " (pid:");
+ }
+
+ write_unsigned (fd, getpid (), 10);
+ write_string (fd, "): ");
}
}
@@ -530,7 +583,6 @@
GErrorFunc local_glib_error_func;
GWarningFunc local_glib_warning_func;
GPrintFunc local_glib_message_func;
- gchar prg_pid[64], *prg_name = g_get_prgname ();
in_recursion = (log_level & G_LOG_FLAG_RECURSION) != 0;
is_fatal = (log_level & G_LOG_FLAG_FATAL) != 0;
@@ -538,13 +590,6 @@
if (!message)
message = "g_log_default_handler(): (NULL) message";
- if (!prg_name)
- {
- prg_name = "(process";
- sprintf (prg_pid, ":%u): ", getpid ());
- }
- else
- sprintf (prg_pid, " (pid:%u): ", getpid ());
#ifdef G_OS_WIN32
/* Use just stdout as stderr is hard to get redirected from the
Index: gutils.c
===================================================================
RCS file: /cvs/gnome/glib/gutils.c,v
retrieving revision 1.94
diff -u -r1.94 gutils.c
--- gutils.c 2001/04/19 13:33:31 1.94
+++ gutils.c 2001/05/11 03:29:36
@@ -437,9 +437,8 @@
}
else
{
- gchar *str = g_strdup (string);
- gchar *p = str;
- gchar *q;
+ const gchar *p = string;
+ const gchar *q;
gboolean done = FALSE;
while (*p && !done)
@@ -451,16 +450,13 @@
done = TRUE;
}
- *q = 0;
-
for (i=0; i<nkeys; i++)
- if (!g_strcasecmp(keys[i].key, p))
+ if (g_strncasecmp(keys[i].key, p, q - p) == 0 &&
+ keys[i].key[q - p] == '\0')
result |= keys[i].value;
- p = q+1;
+ p = q + 1;
}
-
- g_free (str);
}
return result;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]