Re: [Evolution-hackers] Avoiding a strdup in camel-folder-summar.c



On Sun, 2006-07-09 at 18:45 +0200, Philip Van Hoof wrote:
> This patch is unrelated to the mmap() patches that I've also been
> sending.
> 
> It basically avoids an strdup() by implementing a smarter free_token().
> 
> ps. I'm keeping Varadhan and Jeffrey in CC because the mailinglist
> aren't working (or very slow).

I have double checked this patch. It's working and there's no reason to
strdup() the token if you free it the way I free it in free_token().

If somebody is interested in valgrind reports that show the difference,
just ask.

Note again that this patch is not the mmap() patch. It's only related in
that I've find this issue while developing the mmap() patch. It doesn't
require nor implement the mmap() concepts.

I must, however, remove the strdup() in the mmap() patch also. Because
else the memory is not mmap()ed anymore (defeats the purpose of mmap()).

-- 
Philip Van Hoof, software developer at x-tend 
home: me at pvanhoof dot be 
gnome: pvanhoof at gnome dot org 
work: vanhoof at x-tend dot be 
http://www.pvanhoof.be - http://www.x-tend.be
? camel-mime-tables.c
Index: camel-folder-summary.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/camel-folder-summary.c,v
retrieving revision 1.149
diff -u -r1.149 camel-folder-summary.c
--- camel-folder-summary.c	6 Jul 2006 19:43:46 -0000	1.149
+++ camel-folder-summary.c	9 Jul 2006 16:43:30 -0000
@@ -1339,7 +1339,7 @@
 		if (len <= 0) {
 			ret = NULL;
 		} else if (len<= tokens_len) {
-			ret = g_strdup(tokens[len-1]);
+			ret = tokens[len-1];
 		} else {
 			io(printf ("Invalid token encountered: %d", len));
 			*str = NULL;
@@ -1853,6 +1853,22 @@
 	return ci;
 }
 
+static void
+free_token (gchar *token)
+{
+	gint i=0;
+	gboolean no=FALSE;
+
+	for (i=0; (i < tokens_len); i++)
+	{
+		if (tokens[i] == token)
+			no = TRUE;
+	}
+
+	if (!no)
+		g_free (token);
+}
+
 static CamelMessageContentInfo *
 content_info_load(CamelFolderSummary *s, FILE *in)
 {
@@ -1860,7 +1876,7 @@
 	char *type, *subtype;
 	guint32 count, i;
 	CamelContentType *ct;
-
+	
 	io(printf("Loading content info\n"));
 
 	ci = camel_folder_summary_content_info_new(s);
@@ -1868,8 +1884,11 @@
 	camel_folder_summary_decode_token(in, &type);
 	camel_folder_summary_decode_token(in, &subtype);
 	ct = camel_content_type_new(type, subtype);
-	g_free(type);		/* can this be removed? */
-	g_free(subtype);
+
+
+	free_token (type);		/* can this be removed? */
+	free_token (subtype);
+
 	if (camel_file_util_decode_uint32(in, &count) == -1 || count > 500)
 		goto error;
 	
@@ -1882,8 +1901,8 @@
 		
 		camel_content_type_set_param(ct, name, value);
 		/* TODO: do this so we dont have to double alloc/free */
-		g_free(name);
-		g_free(value);
+		free_token (name);
+		free_token (value);
 	}
 	ci->type = ct;
 
@@ -1937,9 +1956,9 @@
 content_info_free(CamelFolderSummary *s, CamelMessageContentInfo *ci)
 {
 	camel_content_type_unref(ci->type);
-	g_free(ci->id);
-	g_free(ci->description);
-	g_free(ci->encoding);
+	free_token (ci->id);
+	free_token (ci->description);
+	free_token (ci->encoding);
 	e_memchunk_free(s->content_info_chunks, ci);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]