[PATCH] Scaffold -- some gnome-build leaks fix

Rui Lopes <[email protected]>
Newsgroups gmane.comp.gnome.devtools
Message-ID <1062727349.607.11.camel@localhost>
Hi all,

Here are some gnome-build leaks fixes for am backend.


I need you to look at my XXX/TODO comments and tell me what you think!


Regards,
Rui Lopes
gnome_build_gbf-am-build_leaks.patch (text/x-patch, 8.2 KB)
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gnome-build/ChangeLog,v
retrieving revision 1.150
diff -u -r1.150 ChangeLog
--- ChangeLog	11 Aug 2003 17:12:55 -0000	1.150
+++ ChangeLog	5 Sep 2003 01:44:01 -0000
@@ -1,3 +1,13 @@
+2003-09-05  Rui Lopes  <[email protected]>
+
+	* po/POTFILES.in: Added src/backends/libgbf_am/gbf-am-build.c.
+	* src/backends/libgbf_am/gbf-am-build.c: (build_info_free),
+	(parse_output), (build_output_cb), (gbf_build_run): Fixed
+	file descriptor leakage.  Fixed some memory leaks.  Added charset
+	conversion from locale to UTF-8 into program capture io channel.
+	* src/gbf/gbf-build-info.c: (gbf_build_info_instance_init):
+	Added a TODO comment.
+
 2003-08-11  Alex Duggan  <[email protected]>
 
 	* configure.in: Fix chmod +x warnings
Index: po/POTFILES.in
===================================================================
RCS file: /cvs/gnome/gnome-build/po/POTFILES.in,v
retrieving revision 1.10
--- po/POTFILES.in	9 Apr 2003 04:56:45 -0000	1.10
+++ po/POTFILES.in	5 Sep 2003 01:28:12 -0000
@@ -1,5 +1,6 @@
 # List of source files containing translatable strings.
 # Please keep this file sorted alphabetically.
+src/backends/libgbf_am/gbf-am-build.c
 src/backends/libgbf_am/gbf-am-config.c
 src/backends/libgbf_am/gbf-am-project.c
 src/backends/libgbf_am/gbf-am.server.in
Index: src/backends/libgbf_am/gbf-am-build.c
===================================================================
RCS file: /cvs/gnome/gnome-build/src/backends/libgbf_am/gbf-am-build.c,v
retrieving revision 1.4
--- src/backends/libgbf_am/gbf-am-build.c	9 Apr 2003 04:56:48 -0000	1.4
+++ src/backends/libgbf_am/gbf-am-build.c	5 Sep 2003 01:28:13 -0000
@@ -27,12 +27,10 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
 #include <regex.h>
 #include "gbf-i18n.h"
 #include "gbf-am-build.h"
 
-/* FIXME: mark strings for translation and this file to POTFILES.in */
-
 typedef struct {
 	GbfAmProject *project;
 	GbfBuildType type;
@@ -50,6 +48,23 @@
 	char *build_dir;
 } BuildInfo;
 
+
+static void
+build_info_free (BuildInfo *info)
+{
+	g_assert (info);
+	
+	if (info->build_dir)
+		g_free (info->build_dir);
+	if (info->dir_buf.fastmap)
+		g_free (info->dir_buf.fastmap);
+	if (info->warn_buf.fastmap)
+		g_free (info->warn_buf.fastmap);
+	if (info->err_buf.fastmap)
+		g_free (info->err_buf.fastmap);
+	g_free (info);
+}
+
 static void
 build_msg (BuildInfo      *info,
 	   GbfBuildMessage type,
@@ -69,13 +84,15 @@
 parse_output (BuildInfo  *info,
 	      const char *line)
 {
+	int line_length = strlen (line);
+
 	/* Check for directory changes. */
-	if (re_search (&info->dir_buf, line, strlen (line), 0,
-		       strlen (line), &info->reg) != -1) {
+	if (re_search (&info->dir_buf, line, line_length, 0,
+		       line_length, &info->reg) != -1) {
 		if (info->reg.num_regs >= 2) {
 			if (info->build_dir) {
 				g_free (info->build_dir);
-				info->build_dir = NULL;
+				info->build_dir = NULL; /* XXX: Why? */
 			}
 			info->build_dir = g_strndup (line + info->reg.start[1],
 						     info->reg.end[1] - info->reg.start[1]);
@@ -83,8 +100,8 @@
 	}
 
 	/* Check for warnings & errors. */
-	if (re_search (&info->warn_buf, line, strlen (line), 0,
-		       strlen (line), &info->reg) != -1) {
+	if (re_search (&info->warn_buf, line, line_length, 0,
+		       line_length, &info->reg) != -1) {
 		GbfBuildWarning *warn;
 		char *text;
 
@@ -103,8 +120,9 @@
 		warn->output = g_strdup (line);
 
 		build_msg (info, GBF_BUILD_WARNING, warn);
-	} else if (re_search (&info->err_buf, line, strlen (line), 0,
-			      strlen (line), &info->reg) != -1) {
+		/* XXX: don't we need to free warn? */
+	} else if (re_search (&info->err_buf, line, line_length, 0,
+			      line_length, &info->reg) != -1) {
 		GbfBuildError *err;
 		char *text;
 
@@ -123,6 +141,7 @@
 		err->output = g_strdup (line);
 
 		build_msg (info, GBF_BUILD_ERROR, err);
+		/* XXX: don't we need to free err? */
 	} else {
 		build_msg (info, GBF_BUILD_OUTPUT, (gpointer)line);
 	}
@@ -142,23 +161,16 @@
 
 	status = g_io_channel_read_line (chan, &line, &len, &term, &err);
 	if (status != G_IO_STATUS_NORMAL || line == NULL || err != NULL) {
+		if (err)
+			g_error_free (err); /* TODO: also report err->message using build_msg() */
 		info->num_channels--;
 		if (info->num_channels == 0) {
-			build_msg (info, GBF_BUILD_END, "Build ended");
+			build_msg (info, GBF_BUILD_END, _("Build ended"));
 
 			g_signal_emit_by_name (G_OBJECT (info->project),
 					       "build_stop", TRUE);
 
-			/* Cleanup. */
-			if (info->build_dir)
-				g_free (info->build_dir);
-			if (info->dir_buf.fastmap)
-				g_free (info->dir_buf.fastmap);
-			if (info->warn_buf.fastmap)
-				g_free (info->warn_buf.fastmap);
-			if (info->err_buf.fastmap)
-				g_free (info->err_buf.fastmap);
-			g_free (info);
+			build_info_free (info);
 		}
 
 		return FALSE;
@@ -205,11 +217,12 @@
 	static const char *dir_regex = "Entering directory `([^']+)'";
 	static const char *warn_regex = "^([^:]+):([0-9]+): warning: (.+)$";
 	static const char *err_regex = "^([^:]+):([0-9]+): (.+)$";
+	/* TODO: These paths should come from a configuration interface .. */
 	static const char *prepare_argv[] = { "./autogen.sh", "--prefix=/gnome", NULL };
 	static const char *configure_argv[] = { "./configure", "--prefix=/gnome", NULL };
 	static const char *clean_argv[] = {"/usr/bin/make", "clean", NULL };
 	static const char *all_argv[] = { "/usr/bin/make", "all", NULL };
 	static const char *install_argv[] = {"/usr/bin/make", "install", NULL };
 	static int buildid = 0;
 	const char **argv = NULL;
 	BuildInfo *info;
@@ -232,11 +245,14 @@
 		argv = all_argv;
 		break;
 	case GBF_BUILD_CURRENT:
-		g_warning ("no build for current");
+		g_warning ("no build for current\n");
 		break;
 	case GBF_BUILD_INSTALL:
 		argv = install_argv;
 		break;
+	default:
+		g_warning ("invalid build type\n");
+		return -1;
 	}
 
 	if (!g_spawn_async_with_pipes (project_dir,
@@ -246,12 +262,32 @@
 				       &pid, 
 				       NULL, &output, &err,
 				       NULL)) {
+		/* XXX: This error shouldnt go to the interface using build_msg()? */
 		g_warning ("Couldn't spawn %s\n", argv[0]);
 		return -1;
 	}
 
 	out_channel = g_io_channel_unix_new (output);
+	g_io_channel_set_close_on_unref (out_channel, TRUE);
 	err_channel = g_io_channel_unix_new (err);
+	g_io_channel_set_close_on_unref (err_channel, TRUE);
+	/* set io channel encoding if current locale is not utf-8 */
+	{
+		GError *error = NULL;
+		const char *charset;
+		if (!g_get_charset (&charset)) {
+			if (G_IO_STATUS_NORMAL != g_io_channel_set_encoding (out_channel, charset, &error) ||
+			    G_IO_STATUS_NORMAL != g_io_channel_set_encoding (err_channel, charset, &error)) {
+				g_io_channel_unref (out_channel);
+				g_io_channel_unref (err_channel);
+
+				/* XXX: report this to interface using build_msg? */
+				g_warning ("Failed to set encodings: %s\n", error->message);
+				g_error_free (error);
+				return -1;
+			}
+		}
+	}
 
 	info = g_new0 (BuildInfo, 1);
 	info->project = project;
@@ -262,12 +298,16 @@
 	info->build_dir = NULL;
 
 	/* Intialize regexs. */
+	/* XXX: gnu regex do not support utf8, we should use PCRE */
 	old_options = re_syntax_options;
 	re_syntax_options = RE_SYNTAX_EGREP;
 
 	if (!compile_pattern (&info->dir_buf, dir_regex) ||
 	    !compile_pattern (&info->warn_buf, warn_regex) ||
 	    !compile_pattern (&info->err_buf, err_regex)) {
+		g_io_channel_unref (out_channel);
+		g_io_channel_unref (err_channel);
+		build_info_free (info);
 		g_warning ("failed to compile regexs necessary for build output parsing");
 		return -1;
 	}
Index: src/gbf/gbf-build-info.c
===================================================================
RCS file: /cvs/gnome/gnome-build/src/gbf/gbf-build-info.c,v
retrieving revision 1.22
--- src/gbf/gbf-build-info.c	9 Apr 2003 04:56:49 -0000	1.22
+++ src/gbf/gbf-build-info.c	5 Sep 2003 01:28:13 -0000
@@ -153,7 +153,7 @@
 	g_signal_connect (priv->text_view, "motion-notify-event",
 			  G_CALLBACK (motion_notify_cb), info);
 
-	font_desc = pango_font_description_from_string ("mono 9");
+	font_desc = pango_font_description_from_string ("mono 9"); /* TODO: Get font description from config */
 	gtk_widget_modify_font (priv->text_view, font_desc);
 	pango_font_description_free (font_desc);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.