diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2010-06-24 23:12:53 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2010-06-24 23:12:53 +0800 |
commit | 6f014d4779a7bf13d39cdc6eea153cb40dba1b24 (patch) | |
tree | b57d93af9d64b320987f21fb950361409f4d95f7 | |
parent | ef9b23ef998f8dd4e987c5e7443a36dd48e59b2e (diff) | |
download | gsoc2013-evolution-6f014d4779a7bf13d39cdc6eea153cb40dba1b24.tar.gz gsoc2013-evolution-6f014d4779a7bf13d39cdc6eea153cb40dba1b24.tar.zst gsoc2013-evolution-6f014d4779a7bf13d39cdc6eea153cb40dba1b24.zip |
Bug 622547 - mail_async_event_destroy() doesn't cancel its idle callback
-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); |