[evolution-patches] Fix for "agressive" memory segmentation
- From: Philip Van Hoof <spam pvanhoof be>
- To: evolution-hackers gnome org
- Cc: evolution-patches gnome org
- Subject: [evolution-patches] Fix for "agressive" memory segmentation
- Date: Thu, 06 Jul 2006 20:31:26 +0200
Camel makes some "aggressive" memory segmentation happen when loading
the folder summary.
This fixes that.
This is NOT yet the mmap() idea. That will come later.
--
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
Index: camel-folder-summary.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/camel-folder-summary.c,v
retrieving revision 1.148
diff -u -r1.148 camel-folder-summary.c
--- camel-folder-summary.c 12 Apr 2006 19:14:13 -0000 1.148
+++ camel-folder-summary.c 6 Jul 2006 18:28:30 -0000
@@ -1625,17 +1625,19 @@
if (ct)
camel_content_type_unref(ct);
- mi->subject = camel_pstring_strdup(subject);
- mi->from = camel_pstring_strdup(from);
- mi->to = camel_pstring_strdup(to);
- mi->cc = camel_pstring_strdup(cc);
- mi->mlist = camel_pstring_strdup(mlist);
+ mi->subject = camel_pstring_strdup_or_reuse (subject);
+ mi->from = camel_pstring_strdup_or_reuse (from);
+ mi->to = camel_pstring_strdup_or_reuse(to);
+ mi->cc = camel_pstring_strdup_or_reuse(cc);
+ mi->mlist = camel_pstring_strdup_or_reuse(mlist);
+/*
g_free(subject);
g_free(from);
g_free(to);
g_free(cc);
g_free(mlist);
+*/
mi->user_flags = NULL;
mi->user_tags = NULL;
@@ -1711,18 +1713,19 @@
camel_file_util_decode_string(in, &mlist);
mi->uid = uid;
- mi->subject = camel_pstring_strdup(subject);
- mi->from = camel_pstring_strdup(from);
- mi->to = camel_pstring_strdup(to);
- mi->cc = camel_pstring_strdup(cc);
- mi->mlist = camel_pstring_strdup(mlist);
+ mi->subject = camel_pstring_strdup_or_reuse (subject);
+ mi->from = camel_pstring_strdup_or_reuse (from);
+ mi->to = camel_pstring_strdup_or_reuse (to);
+ mi->cc = camel_pstring_strdup_or_reuse (cc);
+ mi->mlist = camel_pstring_strdup_or_reuse (mlist);
+/*
g_free(subject);
g_free(from);
g_free(to);
g_free(cc);
g_free(mlist);
-
+*/
mi->content = NULL;
camel_file_util_decode_fixed_int32(in, &mi->message_id.id.part.hi);
Index: camel-string-utils.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/camel-string-utils.c,v
retrieving revision 1.5
diff -u -r1.5 camel-string-utils.c
--- camel-string-utils.c 15 Sep 2005 17:35:45 -0000 1.5
+++ camel-string-utils.c 6 Jul 2006 18:28:31 -0000
@@ -186,6 +186,48 @@
return p;
}
+
+
+/**
+ * camel_pstring_strdup_or_reuse:
+ * @s: String to copy.
+ *
+ * Create a new pooled string entry for the string @s. A pooled
+ * string is a table where common strings are uniquified to the same
+ * pointer value. They are also refcounted, so freed when no longer
+ * in use. In a thread-safe manner.
+ *
+ * The NULL and empty strings are special cased to constant values.
+ *
+ * Return value: A pointer to an equivalent string of @s. Use
+ * camel_pstring_free() when it is no longer needed.
+ **/
+const char *camel_pstring_strdup_or_reuse (const char *s)
+{
+ char *p;
+ void *pcount;
+ int count;
+
+ if (s == NULL)
+ return NULL;
+ if (s[0] == 0)
+ return "";
+
+ pthread_mutex_lock(&pstring_lock);
+ if (pstring_table == NULL)
+ pstring_table = g_hash_table_new(g_str_hash, g_str_equal);
+
+ if (g_hash_table_lookup_extended(pstring_table, s, (void **)&p, &pcount)) {
+ count = GPOINTER_TO_INT(pcount)+1;
+ g_hash_table_insert(pstring_table, p, GINT_TO_POINTER(count));
+ g_free (s);
+ } else {
+ p = s;
+ g_hash_table_insert(pstring_table, p, GINT_TO_POINTER(1));
+ }
+ pthread_mutex_unlock(&pstring_lock);
+ return p;
+}
/**
* camel_pstring_free:
* @s: String to free.
Index: camel-string-utils.h
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/camel-string-utils.h,v
retrieving revision 1.5
diff -u -r1.5 camel-string-utils.h
--- camel-string-utils.h 31 Aug 2005 04:21:56 -0000 1.5
+++ camel-string-utils.h 6 Jul 2006 18:28:31 -0000
@@ -43,6 +43,8 @@
char camel_toupper(char c);
const char *camel_pstring_strdup(const char *s);
+const char *camel_pstring_strdup_or_reuse (const char *s);
+
void camel_pstring_free(const char *s);
#ifdef __cplusplus
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]