aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-mt.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-mt.c')
-rw-r--r--mail/mail-mt.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/mail/mail-mt.c b/mail/mail-mt.c
index 69646e44fd..2ce8f6cab4 100644
--- a/mail/mail-mt.c
+++ b/mail/mail-mt.c
@@ -260,6 +260,28 @@ void mail_msg_wait(unsigned int msgid)
}
}
+void mail_msg_wait_all(void)
+{
+ struct _mail_msg *m;
+ int ismain = pthread_self() == mail_gui_thread;
+
+ if (ismain) {
+ MAIL_MT_LOCK(mail_msg_lock);
+ while (g_hash_table_size(mail_msg_active) > 0) {
+ MAIL_MT_UNLOCK(mail_msg_lock);
+ gtk_main_iteration();
+ MAIL_MT_LOCK(mail_msg_lock);
+ }
+ MAIL_MT_UNLOCK(mail_msg_lock);
+ } else {
+ MAIL_MT_LOCK(mail_msg_lock);
+ while (g_hash_table_size(mail_msg_active) > 0) {
+ pthread_cond_wait(&mail_msg_cond, &mail_msg_lock);
+ }
+ MAIL_MT_UNLOCK(mail_msg_lock);
+ }
+}
+
EMsgPort *mail_gui_port;
static GIOChannel *mail_gui_channel;
EMsgPort *mail_gui_reply_port;
@@ -366,16 +388,19 @@ mail_msg_received(EThread *e, EMsg *msg, void *data)
}
}
-static void mail_msg_cleanup(void)
+void mail_msg_cleanup(void)
{
+ mail_msg_wait_all();
+
e_thread_destroy(mail_thread_queued_slow);
e_thread_destroy(mail_thread_queued);
e_thread_destroy(mail_thread_new);
+ g_io_channel_unref(mail_gui_channel);
+ g_io_channel_unref(mail_gui_reply_channel);
+
e_msgport_destroy(mail_gui_port);
e_msgport_destroy(mail_gui_reply_port);
-
- /* FIXME: channels too, etc */
}
void mail_msg_init(void)
@@ -406,8 +431,6 @@ void mail_msg_init(void)
mail_msg_active = g_hash_table_new(NULL, NULL);
mail_gui_thread = pthread_self();
-
- atexit(mail_msg_cleanup);
}
/* ********************************************************************** */
@@ -450,6 +473,8 @@ pass_got (char *string, void *data)
service = mca->transport;
}
+ mail_config_service_set_save_passwd (service, remember);
+
if (mca) {
mail_config_service_set_save_passwd (service, remember);