From: Colin Leroy Date: Wed, 8 Jun 2005 16:35:44 +0000 (+0000) Subject: 2005-06-08 [colin] 1.9.11cvs50 X-Git-Tag: rel_1_9_12~57 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=027328c366aca2aa410d8de5b75b8a54c58b7d51 2005-06-08 [colin] 1.9.11cvs50 * src/imap.c Test patch to speed up imap. --- diff --git a/ChangeLog-gtk2.claws b/ChangeLog-gtk2.claws index fb04d4bc5..21ef8c665 100644 --- a/ChangeLog-gtk2.claws +++ b/ChangeLog-gtk2.claws @@ -1,3 +1,8 @@ +2005-06-08 [colin] 1.9.11cvs50 + + * src/imap.c + Test patch to speed up imap. + 2005-06-08 [colin] 1.9.11cvs49 * src/imap_gtk.c diff --git a/PATCHSETS b/PATCHSETS index 455fd1dea..f601206a4 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -538,3 +538,4 @@ ( cvs diff -u -r 1.382.2.128 -r 1.382.2.129 src/compose.c; ) > 1.9.11cvs47.patchset ( cvs diff -u -r 1.65.2.30 -r 1.65.2.31 src/codeconv.c; cvs diff -u -r 1.382.2.129 -r 1.382.2.130 src/compose.c; cvs diff -u -r 1.50.2.8 -r 1.50.2.9 src/compose.h; ) > 1.9.11cvs48.patchset ( cvs diff -u -r 1.1.2.8 -r 1.1.2.9 src/imap_gtk.c; cvs diff -u -r 1.49.2.45 -r 1.49.2.46 src/procmime.c; cvs diff -u -r 1.6 -r 1.7 src/common/log.c; cvs diff -u -r 1.4 -r 1.5 src/common/log.h; ) > 1.9.11cvs49.patchset +( cvs diff -u -r 1.179.2.19 -r 1.179.2.20 src/imap.c; ) > 1.9.11cvs50.patchset diff --git a/configure.ac b/configure.ac index 9d21f875f..752c8e237 100644 --- a/configure.ac +++ b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=9 MICRO_VERSION=11 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=49 +EXTRA_VERSION=50 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/imap.c b/src/imap.c index 4372dc8d4..b60314c9c 100644 --- a/src/imap.c +++ b/src/imap.c @@ -1898,10 +1898,20 @@ static gint imap_remove_folder(Folder *folder, FolderItem *item) return 0; } -static GSList *imap_get_uncached_messages(IMAPSession *session, - FolderItem *item, - MsgNumberList *numlist) +typedef struct _uncached_data { + IMAPSession *session; + FolderItem *item; + MsgNumberList *numlist; + gboolean done; +} uncached_data; + +static void *imap_get_uncached_messages_thread(void *data) { + uncached_data *stuff = (uncached_data *)data; + IMAPSession *session = stuff->session; + FolderItem *item = stuff->item; + MsgNumberList *numlist = stuff->numlist; + gchar *tmp; GSList *newlist = NULL; GSList *llast = NULL; @@ -1910,10 +1920,11 @@ static GSList *imap_get_uncached_messages(IMAPSession *session, GSList *seq_list, *cur; IMAPSet imapset; - g_return_val_if_fail(session != NULL, NULL); - g_return_val_if_fail(item != NULL, NULL); - g_return_val_if_fail(item->folder != NULL, NULL); - g_return_val_if_fail(FOLDER_CLASS(item->folder) == &imap_class, NULL); + if (session == NULL || item == NULL || item->folder == NULL + || FOLDER_CLASS(item->folder) != &imap_class) { + stuff->done = TRUE; + return NULL; + } seq_list = imap_get_seq_set_from_numlist(numlist); for (cur = seq_list; cur != NULL; cur = g_slist_next(cur)) { @@ -1928,7 +1939,7 @@ static GSList *imap_get_uncached_messages(IMAPSession *session, str = g_string_new(NULL); for (;;) { - if ((tmp = imap_getline(SESSION(session)->sock)) == NULL) { + if ((tmp =sock_getline(SESSION(session)->sock)) == NULL) { log_warning(_("error occurred while getting envelope.\n")); g_string_free(str, TRUE); break; @@ -1975,10 +1986,47 @@ static GSList *imap_get_uncached_messages(IMAPSession *session, imap_seq_set_free(seq_list); session_set_access_time(SESSION(session)); + stuff->done = TRUE; return newlist; } +static GSList *imap_get_uncached_messages(IMAPSession *session, + FolderItem *item, + MsgNumberList *numlist) +{ + uncached_data *data = g_new0(uncached_data, 1); + GSList *result = NULL; +#ifdef USE_PTHREAD + pthread_t pt; +#endif + data->done = FALSE; + data->session = session; + data->item = item; + data->numlist = numlist; +#if (defined USE_PTHREAD && defined __GLIBC__ && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3))) + if (pthread_create(&pt, PTHREAD_CREATE_JOINABLE, + imap_get_uncached_messages_thread, data) != 0) { + result = (GSList *)imap_get_uncached_messages_thread(data); + g_free(data); + return result; + } + debug_print("waiting for imap_get_uncached_messages_thread...\n"); + while(!data->done) { + /* don't let the interface freeze while waiting */ + sylpheed_do_idle(); + } + debug_print("imap_get_uncached_messages_thread done\n"); + + /* get the thread's return value and clean its resources */ + pthread_join(pt, (void *)&result); +#else + result = (GSList *)imap_get_uncached_messages_thread(data); +#endif + g_free(data); + return result; +} + static void imap_delete_all_cached_messages(FolderItem *item) { gchar *dir; @@ -2414,7 +2462,7 @@ static gchar *imap_get_header(SockInfo *sock, gchar *cur_pos, gchar **headers, cur_pos = str->str; do { - if ((nextline = imap_getline(sock)) == NULL) + if ((nextline = sock_getline(sock)) == NULL) return cur_pos; block_len += strlen(nextline); g_string_append(str, nextline); @@ -2424,14 +2472,15 @@ static gchar *imap_get_header(SockInfo *sock, gchar *cur_pos, gchar **headers, g_free(nextline); } while (block_len < len); - debug_print("IMAP4< [contents of BODY.PEEK[HEADER.FIELDS (...)]]\n"); + debug_print("IMAP4< [contents of RFC822.HEADER]\n"); *headers = g_strndup(cur_pos, len); + debug_print("IMAP4< %s ---\n", *headers); cur_pos += len; while (isspace(*(guchar *)cur_pos)) cur_pos++; while (*cur_pos == '\0') { - if ((nextline = imap_getline(sock)) == NULL) + if ((nextline = sock_getline(sock)) == NULL) return cur_pos; g_string_assign(str, nextline); cur_pos = str->str; @@ -2533,24 +2582,10 @@ static MsgInfo *imap_parse_envelope(SockInfo *sock, FolderItem *item, } else if (!strncmp(cur_pos, "RFC822.SIZE ", 12)) { cur_pos += 12; size = strtol(cur_pos, &cur_pos, 10); - } else if (!strncmp(cur_pos, "BODY[HEADER.FIELDS ", 19)) { + } else if (!strncmp(cur_pos, "RFC822.HEADER ", 14)) { gchar *headers; - cur_pos += 19; - if (*cur_pos != '(') { - g_warning("*cur_pos != '('\n"); - procmsg_msginfo_free(msginfo); - return NULL; - } - cur_pos++; - PARSE_ONE_ELEMENT(')'); - if (*cur_pos != ']') { - g_warning("*cur_pos != ']'\n"); - procmsg_msginfo_free(msginfo); - return NULL; - } - cur_pos++; - + cur_pos += 14; cur_pos = imap_get_header(sock, cur_pos, &headers, line_str); msginfo = procheader_parse_str(headers, flags, FALSE, FALSE); @@ -3187,7 +3222,6 @@ static MsgNumberList *imapset_to_numlist(IMAPSet imapset) ranges = g_strsplit(imapset, ",", 0); for (range = ranges; *range != NULL; range++) { - printf("%s\n", *range); if (sscanf(*range, "%u:%u", &low, &high) == 1) uids = g_slist_prepend(uids, GINT_TO_POINTER(low)); else { @@ -3291,8 +3325,8 @@ gint imap_cmd_envelope(IMAPSession *session, IMAPSet set) } imap_gen_send - (session, "UID FETCH %s (UID FLAGS RFC822.SIZE BODY.PEEK[HEADER.FIELDS (%s)])", - set, header_fields->str); + (session, "UID FETCH %s (UID FLAGS RFC822.SIZE RFC822.HEADER)", + set); return IMAP_SUCCESS; }