aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog17
-rw-r--r--mail/component-factory.c4
-rw-r--r--mail/folder-browser.c3
-rw-r--r--mail/mail-folder-cache.c2
-rw-r--r--mail/mail-local.c2
-rw-r--r--mail/mail-mt.c8
-rw-r--r--mail/mail-mt.h1
-rw-r--r--mail/mail-ops.c6
-rw-r--r--mail/mail-ops.h3
-rw-r--r--mail/mail-tools.c1
-rw-r--r--mail/mail-vfolder.c14
11 files changed, 49 insertions, 12 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 57542c79b6..d80996b300 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,20 @@
+2001-09-20 <NotZed@Ximian.com>
+
+ * mail-tools.c(mail_tool_uri_to_folder): Register vfolder sources here.
+
+ * folder-browser.c (got_folder): Dont register vfolder sources
+ here.
+
+ * mail-ops.c (mail_get_folder): Add thread parameter. Fix callers.
+
+ * mail-vfolder.c (vfolder_setup): Use the 'slow' queue for setting
+ up vfolders.
+
+ * mail-mt.c (mail_msg_init): Limit the maximum number of threads
+ on the 'new' thread to 10.
+ (mail_msg_init): Create a new queue 'slow' for doing slow
+ operations.
+
2001-09-20 Iain Holmes <iain@ximian.com>
* mail-display.c (mail_error_write): Add a <blockquote> to make the
diff --git a/mail/component-factory.c b/mail/component-factory.c
index 89f5731a80..6965b004e6 100644
--- a/mail/component-factory.c
+++ b/mail/component-factory.c
@@ -207,7 +207,7 @@ create_folder (EvolutionShellComponent *shell_component,
CORBA_exception_init (&ev);
if (!strcmp (type, "mail")) {
- mail_get_folder (physical_uri, create_folder_done, CORBA_Object_duplicate (listener, &ev));
+ mail_get_folder(physical_uri, create_folder_done, CORBA_Object_duplicate (listener, &ev), mail_thread_new);
} else {
GNOME_Evolution_ShellComponentListener_notifyResult (
listener, GNOME_Evolution_ShellComponentListener_UNSUPPORTED_TYPE, &ev);
@@ -665,7 +665,7 @@ owner_set_cb (EvolutionShellComponent *shell_component,
for (i = 0; i < sizeof (standard_folders) / sizeof (standard_folders[0]); i++) {
*standard_folders[i].uri = g_strdup_printf ("file://%s/local/%s", evolution_dir, standard_folders[i].name);
- mail_msg_wait (mail_get_folder (*standard_folders[i].uri, got_folder, standard_folders[i].folder));
+ mail_msg_wait(mail_get_folder(*standard_folders[i].uri, got_folder, standard_folders[i].folder, mail_thread_new));
}
mail_session_enable_interaction (TRUE);
diff --git a/mail/folder-browser.c b/mail/folder-browser.c
index daa26c49a3..672c8d8724 100644
--- a/mail/folder-browser.c
+++ b/mail/folder-browser.c
@@ -760,7 +760,6 @@ got_folder(char *uri, CamelFolder *folder, void *data)
folder_browser_is_drafts (fb) ||
folder_browser_is_sent (fb) ||
folder_browser_is_outbox (fb));
- vfolder_register_source (folder);
camel_object_hook_event(CAMEL_OBJECT(fb->folder), "folder_changed",
folder_changed, fb);
@@ -1948,7 +1947,7 @@ folder_browser_new (const GNOME_Evolution_Shell shell, const char *uri)
folder_browser->uri = g_strdup (uri);
gtk_object_ref (GTK_OBJECT (folder_browser));
- mail_get_folder (folder_browser->uri, got_folder, folder_browser);
+ mail_get_folder(folder_browser->uri, got_folder, folder_browser, mail_thread_new);
return GTK_WIDGET (folder_browser);
}
diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c
index 32c68b75de..3921d4a41b 100644
--- a/mail/mail-folder-cache.c
+++ b/mail/mail-folder-cache.c
@@ -40,7 +40,7 @@
#include "mail-folder-cache.h"
#include "mail-ops.h"
-#define d(x) x
+#define d(x)
/* note that many things are effectively serialised by having them run in
the main loop thread which they need to do because of corba/gtk calls */
diff --git a/mail/mail-local.c b/mail/mail-local.c
index 13d03f75f6..bf5556cfcf 100644
--- a/mail/mail-local.c
+++ b/mail/mail-local.c
@@ -852,7 +852,7 @@ static void mail_local_store_add_folder(MailLocalStore *mls, const char *uri, co
/* this is just so the folder is opened at least once to setup the folder
counts etc in the display. Joy eh? The result is discarded. */
- mail_get_folder(uri, NULL, NULL);
+ mail_get_folder(uri, NULL, NULL, mail_thread_queued_slow);
}
}
diff --git a/mail/mail-mt.c b/mail/mail-mt.c
index 634dd91eae..9a2033c2e9 100644
--- a/mail/mail-mt.c
+++ b/mail/mail-mt.c
@@ -244,6 +244,7 @@ static GIOChannel *mail_gui_reply_channel;
/* a couple of global threads available */
EThread *mail_thread_queued; /* for operations that can (or should) be queued */
+EThread *mail_thread_queued_slow; /* for operations that can (or should) be queued, but take a long time */
EThread *mail_thread_new; /* for operations that should run in a new thread each time */
static gboolean
@@ -344,6 +345,7 @@ mail_msg_received(EThread *e, EMsg *msg, void *data)
static void mail_msg_cleanup(void)
{
+ e_thread_destroy(mail_thread_queued_slow);
e_thread_destroy(mail_thread_queued);
e_thread_destroy(mail_thread_new);
@@ -368,10 +370,16 @@ void mail_msg_init(void)
e_thread_set_msg_received(mail_thread_queued, mail_msg_received, 0);
e_thread_set_reply_port(mail_thread_queued, mail_gui_reply_port);
+ mail_thread_queued_slow = e_thread_new(E_THREAD_QUEUE);
+ e_thread_set_msg_destroy(mail_thread_queued_slow, mail_msg_destroy, 0);
+ e_thread_set_msg_received(mail_thread_queued_slow, mail_msg_received, 0);
+ e_thread_set_reply_port(mail_thread_queued_slow, mail_gui_reply_port);
+
mail_thread_new = e_thread_new(E_THREAD_NEW);
e_thread_set_msg_destroy(mail_thread_new, mail_msg_destroy, 0);
e_thread_set_msg_received(mail_thread_new, mail_msg_received, 0);
e_thread_set_reply_port(mail_thread_new, mail_gui_reply_port);
+ e_thread_set_queue_limit(mail_thread_new, 10);
mail_msg_active = g_hash_table_new(NULL, NULL);
mail_gui_thread = pthread_self();
diff --git a/mail/mail-mt.h b/mail/mail-mt.h
index 6ec2255bc7..8f90c3b0c7 100644
--- a/mail/mail-mt.h
+++ b/mail/mail-mt.h
@@ -77,6 +77,7 @@ extern EMsgPort *mail_gui_reply_port;
/* some globally available threads */
extern EThread *mail_thread_queued; /* for operations that can (or should) be queued */
extern EThread *mail_thread_new; /* for operations that should run in a new thread each time */
+extern EThread *mail_thread_queued_slow; /* for operations that can (or should) be queued, but take a long time */
/* The main thread. */
extern pthread_t mail_gui_thread;
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index 569160e68e..a29f19a896 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -1313,18 +1313,18 @@ static struct _mail_msg_op get_folder_op = {
};
int
-mail_get_folder (const char *uri, void (*done) (char *uri, CamelFolder *folder, void *data), void *data)
+mail_get_folder (const char *uri, void (*done)(char *uri, CamelFolder *folder, void *data), void *data, EThread *thread)
{
struct _get_folder_msg *m;
int id;
- m = mail_msg_new (&get_folder_op, NULL, sizeof (*m));
+ m = mail_msg_new(&get_folder_op, NULL, sizeof(*m));
m->uri = g_strdup (uri);
m->data = data;
m->done = done;
id = m->msg.seq;
- e_thread_put (mail_thread_queued, (EMsg *)m);
+ e_thread_put(thread, (EMsg *)m);
return id;
}
diff --git a/mail/mail-ops.h b/mail/mail-ops.h
index b1f429ba64..bc5a15df9a 100644
--- a/mail/mail-ops.h
+++ b/mail/mail-ops.h
@@ -62,7 +62,8 @@ void mail_get_messages (CamelFolder *folder, GPtrArray *uids,
/* same for a folder */
int mail_get_folder (const char *uri,
- void (*done) (char *uri, CamelFolder *folder, void *data), void *data);
+ void (*done) (char *uri, CamelFolder *folder, void *data), void *data,
+ EThread *thread);
/* and for a store */
int mail_get_store (const char *uri,
diff --git a/mail/mail-tools.c b/mail/mail-tools.c
index 406b5f2c47..830ca4c613 100644
--- a/mail/mail-tools.c
+++ b/mail/mail-tools.c
@@ -366,6 +366,7 @@ mail_tool_uri_to_folder (const char *uri, CamelException *ex)
folder = NULL;
}
} else {
+ vfolder_register_source(folder);
mail_note_folder(folder, NULL);
}
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c
index 51740bf30f..c5dec4fb64 100644
--- a/mail/mail-vfolder.c
+++ b/mail/mail-vfolder.c
@@ -133,6 +133,14 @@ struct _setup_msg {
GList *sources_folder;
};
+static char *
+vfolder_setup_desc(struct _mail_msg *mm, int done)
+{
+ struct _setup_msg *m = (struct _setup_msg *)mm;
+
+ return g_strdup_printf(_("Setting up vfolder: %s"), m->folder->full_name);
+}
+
static void
vfolder_setup_do(struct _mail_msg *mm)
{
@@ -140,6 +148,8 @@ vfolder_setup_do(struct _mail_msg *mm)
GList *l, *list = NULL;
CamelFolder *folder;
+ printf("Setting up vfolder: %s\n", m->folder->full_name);
+
camel_vee_folder_set_expression((CamelVeeFolder *)m->folder, m->query);
l = m->sources_uri;
@@ -204,7 +214,7 @@ vfolder_setup_free (struct _mail_msg *mm)
}
static struct _mail_msg_op vfolder_setup_op = {
- NULL,
+ vfolder_setup_desc,
vfolder_setup_do,
vfolder_setup_done,
vfolder_setup_free,
@@ -224,7 +234,7 @@ vfolder_setup(CamelFolder *folder, const char *query, GList *sources_uri, GList
m->sources_folder = sources_folder;
id = m->msg.seq;
- e_thread_put(mail_thread_queued, (EMsg *)m);
+ e_thread_put(mail_thread_queued_slow, (EMsg *)m);
return id;
}