From: Chenthill Palanisamy Date: Sun, 7 Feb 2010 18:43:30 +0000 (+0530) Subject: Start parallel fetches for a large message. Set multi-size to X-Git-Tag: upstream/3.7.4~3399 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=24af600ae3dec8196f5566da36874b927a9364ff;p=platform%2Fupstream%2Fevolution-data-server.git Start parallel fetches for a large message. Set multi-size to 2KB as per rfc 2683. Unref the folders. Do not wait in select if commands are active. Fixes a dead-lock in parser thread. Reduce the priority during iterative fetches so that the user triggered fetch is always at high priority. --- diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c index 3728270..0583395 100644 --- a/camel/providers/imapx/camel-imapx-server.c +++ b/camel/providers/imapx/camel-imapx-server.c @@ -63,7 +63,7 @@ /* All comms with server go here */ /* Try pipelining fetch requests, 'in bits' */ -#define MULTI_SIZE (10240) +#define MULTI_SIZE (20480) /* How many outstanding commands do we allow before we just queue them? */ #define MAX_COMMANDS (10) @@ -845,7 +845,8 @@ imapx_command_start_next(CamelIMAPXServer *is, CamelException *ex) camel_dlist_remove((CamelDListNode *)ic); imapx_command_start(is, ic); count++; - } + } else + break; ic = nc; nc = nc->next; } @@ -1519,7 +1520,7 @@ imapx_completion(CamelIMAPXServer *imap, guchar *token, gint len, CamelException ic->status = imap_parse_status(imap->stream, ex); if (ic->complete) - ic->complete(imap, ic); + ic->complete (imap, ic); QUEUE_LOCK(imap); imapx_command_start_next(imap, ex); @@ -1906,16 +1907,13 @@ imapx_select (CamelIMAPXServer *is, CamelFolder *folder, gboolean forced, CamelE if (is->select && strcmp(is->select, folder->full_name) == 0 && !forced) return; + + if (!camel_dlist_empty(&is->active)) + return; is->select_pending = folder; camel_object_ref(folder); if (is->select_folder) { - while (!camel_dlist_empty(&is->active)) { - QUEUE_UNLOCK(is); - sleep (1); - QUEUE_LOCK(is); - } - g_free(is->select); camel_object_unref(is->select_folder); is->select = NULL; @@ -2169,7 +2167,7 @@ exception: if (ex->id != CAMEL_EXCEPTION_USER_CANCEL) { printf("Re Connection failed: %s\n", ex->desc); imapx_disconnect (is); - sleep(5); + sleep(1); // camelexception_done? camel_exception_clear (ex); goto retry; @@ -2224,7 +2222,7 @@ imapx_command_fetch_message_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic) camel_imapx_command_add(ic, ")"); ic->complete = imapx_command_fetch_message_done; ic->job = job; - ic->pri = job->pri; + ic->pri = job->pri - 1; job->u.get_message.fetch_offset += MULTI_SIZE; job->commands++; imapx_command_queue(is, ic); @@ -2263,7 +2261,7 @@ imapx_job_get_message_start(CamelIMAPXServer *is, CamelIMAPXJob *job) This doesn't work yet, so we always force a select every time */ if (job->u.get_message.use_multi_fetch) { - for (i=0;i < 1;i++) { + for (i=0; i < 3 && job->u.get_message.fetch_offset < job->u.get_message.size;i++) { ic = camel_imapx_command_new("FETCH", job->folder->full_name, "UID FETCH %t (BODY.PEEK[]", job->u.get_message.uid); camel_imapx_command_add(ic, "<%u.%u>", job->u.get_message.fetch_offset, MULTI_SIZE); @@ -2355,6 +2353,9 @@ imapx_command_copy_messages_step_done (CamelIMAPXServer *is, CamelIMAPXCommand * } cleanup: + camel_object_unref (job->u.copy_messages.dest); + camel_object_unref (job->folder); + imapx_job_done (job); camel_imapx_command_free (ic); } @@ -2531,6 +2532,7 @@ imapx_command_step_fetch_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic) ic = camel_imapx_command_new("FETCH", job->folder->full_name, "UID FETCH "); ic->complete = imapx_command_step_fetch_done; ic->job = job; + ic->pri = job->pri - 1; job->u.refresh_info.last_index = i; for (;ilen;i++) { @@ -2746,9 +2748,10 @@ imapx_command_fetch_new_messages_done (CamelIMAPXServer *is, CamelIMAPXCommand * camel_object_trigger_event(ic->job->folder, "folder_changed", ic->job->u.refresh_info.changes); } - camel_operation_end (ic->job->op); exception: + camel_operation_end (ic->job->op); + if (ic->job->noreply) camel_folder_change_info_free(ic->job->u.refresh_info.changes);