[evolution-data-server/gnome-2-30] Bug #617263 - Crash of e-addressbook-factory on second start of evolution
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/gnome-2-30] Bug #617263 - Crash of e-addressbook-factory on second start of evolution
- Date: Fri, 30 Apr 2010 11:27:47 +0000 (UTC)
commit 9e8f81d43b4a304492eacd721fffb0d9a7f68add
Author: Milan Crha <mcrha redhat com>
Date: Fri Apr 30 13:27:15 2010 +0200
Bug #617263 - Crash of e-addressbook-factory on second start of evolution
.../backends/google/e-book-backend-google.c | 1 +
addressbook/libedata-book/e-data-book-factory.c | 18 +++++++++++++-
calendar/libedata-cal/e-data-cal-factory.c | 26 ++++++++++++++++----
3 files changed, 39 insertions(+), 6 deletions(-)
---
diff --git a/addressbook/backends/google/e-book-backend-google.c b/addressbook/backends/google/e-book-backend-google.c
index eddd9bf..7e14284 100644
--- a/addressbook/backends/google/e-book-backend-google.c
+++ b/addressbook/backends/google/e-book-backend-google.c
@@ -521,6 +521,7 @@ e_book_backend_google_load_source (EBookBackend *backend,
use_ssl_str = e_source_get_property (source, "ssl");
use_cache_str = e_source_get_property (source, "offline_sync");
+ refresh_interval = 3600;
if (refresh_interval_str) {
if (1 != sscanf (refresh_interval_str, "%u", &refresh_interval)) {
g_warning ("Could not parse refresh-interval!");
diff --git a/addressbook/libedata-book/e-data-book-factory.c b/addressbook/libedata-book/e-data-book-factory.c
index 88a755c..821764c 100644
--- a/addressbook/libedata-book/e-data-book-factory.c
+++ b/addressbook/libedata-book/e-data-book-factory.c
@@ -358,6 +358,19 @@ impl_BookFactory_getBook(EDataBookFactory *factory, const gchar *IN_source, DBus
}
static void
+remove_data_book_cb (gpointer data_bk, gpointer user_data)
+{
+ EDataBook *data_book;
+
+ data_book = E_DATA_BOOK (data_bk);
+ g_return_if_fail (data_book != NULL);
+
+ e_book_backend_remove_client (e_data_book_get_backend (data_book), data_book);
+
+ g_object_unref (data_book);
+}
+
+static void
name_owner_changed (DBusGProxy *proxy,
const gchar *name,
const gchar *prev_owner,
@@ -369,11 +382,14 @@ name_owner_changed (DBusGProxy *proxy,
GList *list = NULL;
g_mutex_lock (factory->priv->connections_lock);
while (g_hash_table_lookup_extended (factory->priv->connections, prev_owner, (gpointer)&key, (gpointer)&list)) {
+ GList *copy = g_list_copy (list);
+
/* this should trigger the book's weak ref notify
* function, which will remove it from the list before
* it's freed, and will remove the connection from
* priv->connections once they're all gone */
- g_object_unref (list->data);
+ g_list_foreach (copy, remove_data_book_cb, NULL);
+ g_list_free (copy);
}
g_mutex_unlock (factory->priv->connections_lock);
diff --git a/calendar/libedata-cal/e-data-cal-factory.c b/calendar/libedata-cal/e-data-cal-factory.c
index e7b6b44..f3b5f99 100644
--- a/calendar/libedata-cal/e-data-cal-factory.c
+++ b/calendar/libedata-cal/e-data-cal-factory.c
@@ -443,6 +443,19 @@ impl_CalFactory_getCal (EDataCalFactory *factory,
}
static void
+remove_data_cal_cb (gpointer data_cl, gpointer user_data)
+{
+ EDataCal *data_cal;
+
+ data_cal = E_DATA_CAL (data_cl);
+ g_return_if_fail (data_cal != NULL);
+
+ e_cal_backend_remove_client (e_data_cal_get_backend (data_cal), data_cal);
+
+ g_object_unref (data_cal);
+}
+
+static void
name_owner_changed (DBusGProxy *proxy,
const gchar *name,
const gchar *prev_owner,
@@ -453,11 +466,14 @@ name_owner_changed (DBusGProxy *proxy,
gchar *key;
GList *list = NULL;
while (g_hash_table_lookup_extended (factory->priv->connections, prev_owner, (gpointer)&key, (gpointer)&list)) {
- /* this should trigger the book's weak ref notify
- * function, which will remove it from the list before
- * it's freed, and will remove the connection from
- * priv->connections once they're all gone */
- g_object_unref (list->data);
+ GList *copy = g_list_copy (list);
+
+ /* this should trigger the book's weak ref notify
+ * function, which will remove it from the list before
+ * it's freed, and will remove the connection from
+ * priv->connections once they're all gone */
+ g_list_foreach (copy, remove_data_cal_cb, NULL);
+ g_list_free (copy);
}
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]