Re: Memory improvement for the tokens in camel_folder_summary.c
Philip Van Hoof <[email protected]>
| Newsgroups | gmane.comp.gnome.evolution.patches |
|---|---|
| Message-ID | <[email protected]> |
On Wed, 2006-07-26 at 06:22 -0600, Veerapuram Varadhan wrote: > On Wed, 2006-07-26 at 10:40 +0000, Philip Van Hoof wrote: > > As pointed out in IRC, when a string that is not in static tokens table, > but, exists in pstring-table, this patch would leak that *string*. > > Phillip: How about an updated patch with discussed changes? (by removing > camel_pstring_*)... which will more or less look like the current > implementation, however, saves some *g_strdups*. Sure, like this? -- 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_tokens_02.diff
(text/x-patch, 3.2 KB)
Index: ChangeLog =================================================================== RCS file: /cvs/gnome/evolution-data-server/ChangeLog,v retrieving revision 1.407 diff -u -p -r1.407 ChangeLog --- ChangeLog 10 Jul 2006 14:23:55 -0000 1.407 +++ ChangeLog 26 Jul 2006 12:34:03 -0000 @@ -1,3 +1,8 @@ +2006-07-20 Philip Van Hoof <[email protected]> + + * camel/camel-folder-summary.c: Better handling of + memory for tokens + 2006-07-10 Harish Krishnaswamy <[email protected]> * configure.in, NEWS: EDS 1.7.4 release updates Index: camel/camel-folder-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/camel-folder-summary.c,v retrieving revision 1.149 diff -u -p -r1.149 camel-folder-summary.c --- camel/camel-folder-summary.c 6 Jul 2006 19:43:46 -0000 1.149 +++ camel/camel-folder-summary.c 26 Jul 2006 12:34:10 -0000 @@ -1242,6 +1242,42 @@ static char * tokens[] = { #define tokens_len (sizeof(tokens)/sizeof(tokens[0])) + +guint bytes; +static gchar* +token_add (gchar *str) +{ + int i; + + if (!str) + return NULL; + + for (i=0; i<tokens_len; i++) + if (!strcmp (str, tokens[i])) + { + g_free (str); + return tokens[i]; + } + + return str; +} + + +static void +token_free (gchar *token) +{ + gint i; + + if (!token) + return; + + for (i = 0; i < tokens_len; i ++) + if (tokens[i] == token) + return; + + g_free (token); +} + /* baiscally ... 0 = null 1-tokens_len == tokens[id-1] @@ -1339,7 +1375,7 @@ camel_folder_summary_decode_token(FILE * 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; @@ -1845,10 +1881,10 @@ content_info_new_from_header(CamelFolder ci = camel_folder_summary_content_info_new (s); charset = e_iconv_locale_charset (); - ci->id = camel_header_msgid_decode (camel_header_raw_find (&h, "content-id", NULL)); - ci->description = camel_header_decode_string (camel_header_raw_find (&h, "content-description", NULL), charset); - ci->encoding = camel_content_transfer_encoding_decode (camel_header_raw_find (&h, "content-transfer-encoding", NULL)); - ci->type = camel_content_type_decode(camel_header_raw_find(&h, "content-type", NULL)); + ci->id = token_add (camel_header_msgid_decode (camel_header_raw_find (&h, "content-id", NULL))); + ci->description = token_add (camel_header_decode_string (camel_header_raw_find (&h, "content-description", NULL), charset)); + ci->encoding = token_add (camel_content_transfer_encoding_decode (camel_header_raw_find (&h, "content-transfer-encoding", NULL))); + ci->type = token_add (camel_content_type_decode(camel_header_raw_find(&h, "content-type", NULL))); return ci; } @@ -1937,9 +1973,9 @@ static void 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); + token_free (ci->id); + token_free (ci->description); + token_free (ci->encoding); e_memchunk_free(s->content_info_chunks, ci); }