Re: [Evolution-hackers] Avoiding a strdup in camel-folder-summar.c
Philip Van Hoof <[email protected]>
| Newsgroups | gmane.comp.gnome.evolution.patches,gmane.comp.gnome.evolution.devel |
|---|---|
| Message-ID | <1152616133.5371.2.camel__26407.4645391249$1152620257$gmane$org@localhost.localdomain> |
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 _______________________________________________ Evolution-patches mailing list [email protected] http://mail.gnome.org/mailman/listinfo/evolution-patches
camel_folder_summary_free_token.diff
(text/x-patch, 2 KB)
? 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);
}