[evolution-exchange] Bug #635590 - Crash on account re-enable
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-exchange] Bug #635590 - Crash on account re-enable
- Date: Thu, 27 Jan 2011 11:37:29 +0000 (UTC)
commit 4b30fc33cb7f66d89adbeb755a66e3ff15687931
Author: Milan Crha <mcrha redhat com>
Date: Thu Jan 27 12:36:26 2011 +0100
Bug #635590 - Crash on account re-enable
camel/camel-exchange-utils.c | 32 ++++++++++++++++++++++++++++++--
1 files changed, 30 insertions(+), 2 deletions(-)
---
diff --git a/camel/camel-exchange-utils.c b/camel/camel-exchange-utils.c
index 16eb528..d3995e8 100644
--- a/camel/camel-exchange-utils.c
+++ b/camel/camel-exchange-utils.c
@@ -148,12 +148,38 @@ is_same_ed (CamelExchangeStore *estore, ExchangeAccount *eaccount, CamelService
}
static void free_folder (gpointer value);
+G_LOCK_DEFINE_STATIC (edies);
+
+static void
+estore_gone_cb (gpointer edies_ptr, GObject *gone_eservice)
+{
+ GSList **edies_lst_ptr = edies_ptr, *l;
+
+ g_return_if_fail (edies_ptr != NULL);
+
+ G_LOCK (edies);
+
+ for (l = *edies_lst_ptr; l; l = l->next) {
+ ExchangeData *ed = l->data;
+
+ if (ed && ed->estore == (CamelExchangeStore *) gone_eservice) {
+ g_hash_table_destroy (ed->folders_by_name);
+ g_static_rec_mutex_free (&ed->changed_msgs_mutex);
+ g_free (ed);
+
+ *edies_lst_ptr = g_slist_remove (*edies_lst_ptr, ed);
+
+ break;
+ }
+ }
+
+ G_UNLOCK (edies);
+}
static ExchangeData *
get_data_for_service (CamelService *service)
{
static GSList *edies = NULL;
- G_LOCK_DEFINE_STATIC (edies);
GSList *p, *accounts;
ExchangeData *res = NULL;
@@ -178,8 +204,10 @@ get_data_for_service (CamelService *service)
if (a && is_same_ed (NULL, a, service)) {
res = g_new0 (ExchangeData, 1);
res->account = a;
- if (CAMEL_IS_EXCHANGE_STORE (service))
+ if (CAMEL_IS_EXCHANGE_STORE (service)) {
res->estore = CAMEL_EXCHANGE_STORE (service);
+ g_object_weak_ref (G_OBJECT (service), estore_gone_cb, &edies);
+ }
res->folders_by_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, free_folder);
g_static_rec_mutex_init (&res->changed_msgs_mutex);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]