diff options
Diffstat (limited to 'mail')
-rw-r--r-- | mail/mail-mt.c | 19 | ||||
-rw-r--r-- | mail/mail-mt.h | 2 |
2 files changed, 14 insertions, 7 deletions
diff --git a/mail/mail-mt.c b/mail/mail-mt.c index de59213ce5..76a6ccc488 100644 --- a/mail/mail-mt.c +++ b/mail/mail-mt.c @@ -605,6 +605,7 @@ struct _proxy_msg { mail_async_event_t type; GThread *thread; + guint idle_id; MailAsyncFunc func; gpointer o; @@ -625,10 +626,11 @@ do_async_event(struct _proxy_msg *m) } static gint -idle_async_event(gpointer mm) +idle_async_event (struct _proxy_msg *m) { - do_async_event(mm); - mail_msg_unref(mm); + m->idle_id = 0; + do_async_event (m); + mail_msg_unref (m); return FALSE; } @@ -652,7 +654,7 @@ mail_async_event_new (void) return ea; } -gint +guint mail_async_event_emit (MailAsyncEvent *ea, mail_async_event_t type, MailAsyncFunc func, @@ -661,7 +663,7 @@ mail_async_event_emit (MailAsyncEvent *ea, gpointer data) { struct _proxy_msg *m; - gint id; + guint id; /* We dont have a reply port for this, we dont * care when/if it gets executed, just queue it. */ @@ -684,7 +686,8 @@ mail_async_event_emit (MailAsyncEvent *ea, * overflow and deadlock us. */ if (type == MAIL_ASYNC_GUI) { if (mail_in_main_thread ()) - g_idle_add(idle_async_event, m); + m->idle_id = g_idle_add ( + (GSourceFunc) idle_async_event, m); else mail_msg_main_loop_push(m); } else @@ -709,6 +712,10 @@ mail_async_event_destroy (MailAsyncEvent *ea) errno = EDEADLK; return -1; } + if (m->idle_id > 0) { + g_source_remove (m->idle_id); + m->idle_id = 0; + } g_mutex_unlock(ea->lock); mail_msg_wait(id); g_mutex_lock(ea->lock); diff --git a/mail/mail-mt.h b/mail/mail-mt.h index 5cfbf2abe1..261b37699f 100644 --- a/mail/mail-mt.h +++ b/mail/mail-mt.h @@ -101,7 +101,7 @@ typedef void (*MailAsyncFunc)(gpointer , gpointer , gpointer ); /* create a new async event handler */ MailAsyncEvent *mail_async_event_new(void); /* forward a camel event (or other call) to the gui thread */ -gint mail_async_event_emit(MailAsyncEvent *ea, mail_async_event_t type, MailAsyncFunc func, gpointer , gpointer , gpointer ); +guint mail_async_event_emit(MailAsyncEvent *ea, mail_async_event_t type, MailAsyncFunc func, gpointer , gpointer , gpointer ); /* wait for all outstanding async events to complete */ gint mail_async_event_destroy(MailAsyncEvent *ea); |