[evolution/gnome-2-28] Bug #602185 - Crash after 'Show only this calendar'



commit d4878c1685fd92b5379013d6f3bddda8a23a5d9e
Author: Milan Crha <mcrha redhat com>
Date:   Mon Feb 22 18:51:43 2010 +0100

    Bug #602185 - Crash after 'Show only this calendar'

 calendar/gui/gnome-cal.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)
---
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index cfdfb6d..dbe9143 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -139,6 +139,7 @@ struct _GnomeCalendarPrivate {
 	ECalMenu    *memopad_menu;
 
 	/* Calendar query for the date navigator */
+	GMutex      *dn_queries_lock; /* lock for dn_queries list */
 	GList       *dn_queries; /* list of CalQueries */
 	gchar        *sexp;
 	gchar        *todo_sexp;
@@ -877,6 +878,8 @@ update_query_async (struct _date_query_msg *msg)
 
 	priv = gcal->priv;
 
+	g_mutex_lock (priv->dn_queries_lock);
+
 	/* free the previous queries */
 	for (l = priv->dn_queries; l != NULL; l = l->next) {
 		old_query = l->data;
@@ -891,6 +894,8 @@ update_query_async (struct _date_query_msg *msg)
 	g_list_free (priv->dn_queries);
 	priv->dn_queries = NULL;
 
+	g_mutex_unlock (priv->dn_queries_lock);
+
 	g_return_if_fail (priv->sexp != NULL);
 
 	real_sexp = adjust_e_cal_view_sexp (gcal, priv->sexp);
@@ -937,7 +942,9 @@ try_again:
 		g_signal_connect (old_query, "view_done",
 				  G_CALLBACK (dn_e_cal_view_done_cb), gcal);
 
+		g_mutex_lock (priv->dn_queries_lock);
 		priv->dn_queries = g_list_append (priv->dn_queries, old_query);
+		g_mutex_unlock (priv->dn_queries_lock);
 
 		e_cal_view_start (old_query);
 	}
@@ -1912,6 +1919,7 @@ gnome_calendar_init (GnomeCalendar *gcal)
 	priv->taskpad_menu = e_cal_menu_new("org.gnome.evolution.calendar.taskpad");
 	priv->memopad_menu = e_cal_menu_new ("org.gnome.evolution.calendar.memopad");
 
+	priv->dn_queries_lock = g_mutex_new ();
 	priv->dn_queries = NULL;
 	priv->sexp = g_strdup ("#t"); /* Match all */
 	priv->todo_sexp = g_strdup ("#t");
@@ -2004,6 +2012,7 @@ gnome_calendar_destroy (GtkObject *object)
 		e_memo_table_save_state (E_MEMO_TABLE (priv->memo), filename);
 		g_free (filename);
 
+		g_mutex_lock (priv->dn_queries_lock);
 		if (priv->dn_queries) {
 			for (l = priv->dn_queries; l != NULL; l = l->next) {
 				g_signal_handlers_disconnect_matched ((ECalView *) l->data, G_SIGNAL_MATCH_DATA,
@@ -2014,6 +2023,9 @@ gnome_calendar_destroy (GtkObject *object)
 			g_list_free (priv->dn_queries);
 			priv->dn_queries = NULL;
 		}
+		g_mutex_unlock (priv->dn_queries_lock);
+		g_mutex_free (priv->dn_queries_lock);
+		priv->dn_queries_lock = NULL;
 
 		if (non_intrusive_error_table) {
 			g_hash_table_destroy (non_intrusive_error_table);
@@ -3372,6 +3384,7 @@ gnome_calendar_remove_source_by_uid (GnomeCalendar *gcal, ECalSourceType source_
 
 	switch (source_type) {
 	case E_CAL_SOURCE_TYPE_EVENT:
+		g_mutex_lock (priv->dn_queries_lock);
 		/* remove the query for this client */
 		for (l = priv->dn_queries; l != NULL; l = l->next) {
 			ECalView *query = l->data;
@@ -3384,6 +3397,7 @@ gnome_calendar_remove_source_by_uid (GnomeCalendar *gcal, ECalSourceType source_
 				break;
 			}
 		}
+		g_mutex_unlock (priv->dn_queries_lock);
 
 		model = e_calendar_view_get_model (priv->views[priv->current_view_type]);
 		e_cal_model_remove_client (model, client);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]