diff options
Diffstat (limited to 'camel')
-rw-r--r-- | camel/ChangeLog | 9 | ||||
-rw-r--r-- | camel/camel-folder-thread.c | 30 | ||||
-rw-r--r-- | camel/camel-folder-thread.h | 4 |
3 files changed, 33 insertions, 10 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 864fafa413..bcd209d453 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,12 @@ +2004-05-07 Not Zed <NotZed@Ximian.com> + + * camel-folder-thread.c (thread_summary): properly set the parent + nodes for the re-parented phantom-node children. Wasn't that fun + to debug! + + * camel-folder-thread.h: make order and re bitfields, saves 4 + bytes/node. + 2004-05-06 Not Zed <NotZed@Ximian.com> * providers/imap/camel-imap-store.c (connect_to_server): set diff --git a/camel/camel-folder-thread.c b/camel/camel-folder-thread.c index a67ab5d5b2..a110cdb28e 100644 --- a/camel/camel-folder-thread.c +++ b/camel/camel-folder-thread.c @@ -37,7 +37,8 @@ #include "camel-folder-thread.h" #include "e-util/e-memory.h" -#define d(x) +#define d(x) +#define m(x) /*#define TIMEIT*/ @@ -114,6 +115,7 @@ prune_empty(CamelFolderThread *thread, CamelFolderThreadNode **cp) if (c->child == NULL) { d(printf("removing empty node\n")); lastc->next = c->next; + m(memset(c, 0xfe, sizeof(*c))); e_memchunk_free(thread->node_chunks, c); continue; } @@ -151,13 +153,13 @@ hashloop(void *key, void *value, void *data) } static char * -get_root_subject(CamelFolderThreadNode *c, int *re) +get_root_subject(CamelFolderThreadNode *c) { char *s, *p; CamelFolderThreadNode *scan; s = NULL; - *re = FALSE; + c->re = FALSE; if (c->message) s = (char *)camel_message_info_subject(c->message); else { @@ -183,7 +185,7 @@ get_root_subject(CamelFolderThreadNode *c, int *re) while (isdigit(*p) || (ispunct(*p) && (*p != ':'))) p++; if (*p==':') { - *re = TRUE; + c->re = TRUE; s = p+1; } else break; @@ -235,7 +237,7 @@ group_root_set(CamelFolderThread *thread, CamelFolderThreadNode **cp) clast = (CamelFolderThreadNode *)cp; c = clast->next; while (c) { - c->root_subject = get_root_subject(c, &c->re); + c->root_subject = get_root_subject(c); if (c->root_subject) { container = g_hash_table_lookup(subject_table, c->root_subject); if (container == NULL @@ -264,6 +266,7 @@ group_root_set(CamelFolderThread *thread, CamelFolderThreadNode **cp) scan = scan->next; scan->next = c->child; clast->next = c->next; + m(memset(c, 0xee, sizeof(*c))); e_memchunk_free(thread->node_chunks, c); continue; } if (c->message == NULL && container->message != NULL) { @@ -521,17 +524,25 @@ thread_summary(CamelFolderThread *thread, GPtrArray *summary) child = c->next; if (child->message == NULL) { newtop = child->child; + newtop->parent = NULL; /* unlink pseudo node */ c->next = newtop; - /* link its siblings onto the end of its children */ + /* link its siblings onto the end of its children, fix all parent pointers */ scan = (CamelFolderThreadNode *)&newtop->child; - while (scan->next) + while (scan->next) { scan = scan->next; + } scan->next = newtop->next; + while (scan->next) { + scan = scan->next; + scan->parent = newtop; + } + /* and link the now 'real' node into the list */ newtop->next = child->next; c = newtop; + m(memset(child, 0xde, sizeof(*child))); e_memchunk_free(thread->node_chunks, child); } else { c = child; @@ -544,6 +555,8 @@ thread_summary(CamelFolderThread *thread, GPtrArray *summary) c = c->next; if (c->message == NULL) g_warning("threading missed removing a pseudo node: %s\n", c->root_subject); + if (c->parent != NULL) + g_warning("base node has a non-null parent: %s\n", c->root_subject); } thread->tree = head; @@ -616,7 +629,8 @@ camel_folder_thread_messages_new (CamelFolder *folder, GPtrArray *uids, gboolean thread_summary(thread, summary); - g_hash_table_destroy(wanted); + if (wanted) + g_hash_table_destroy(wanted); return thread; } diff --git a/camel/camel-folder-thread.h b/camel/camel-folder-thread.h index 8bb78e27a0..9e51016708 100644 --- a/camel/camel-folder-thread.h +++ b/camel/camel-folder-thread.h @@ -36,8 +36,8 @@ typedef struct _CamelFolderThreadNode { *child; const CamelMessageInfo *message; char *root_subject; /* cached root equivalent subject */ - int re; /* re version of subject? */ - int order; + guint32 order:31; + guint32 re:1; /* re version of subject? */ } CamelFolderThreadNode; typedef struct _CamelFolderThread { |