[evolution-data-server] Start/stop book/cal views in a dedicated thread



commit d43dd4f422fe26cdb1bd4b96ef2d2f25611c0c59
Author: Milan Crha <mcrha redhat com>
Date:   Tue Aug 21 15:22:29 2012 +0200

    Start/stop book/cal views in a dedicated thread
    
    Thus the backend, if it does any expensive operation during
    the start/stop call, will not block factory's main thread,
    thus the factory will not get unresponsive. This could happen
    during autocompletion, for example.

 addressbook/libedata-book/e-data-book-view.c |   51 +++++++++++++-------------
 calendar/libedata-cal/e-data-cal-view.c      |   35 +++++++++++++++++-
 2 files changed, 58 insertions(+), 28 deletions(-)
---
diff --git a/addressbook/libedata-book/e-data-book-view.c b/addressbook/libedata-book/e-data-book-view.c
index 4ce921b..63afd06 100644
--- a/addressbook/libedata-book/e-data-book-view.c
+++ b/addressbook/libedata-book/e-data-book-view.c
@@ -63,7 +63,6 @@ struct _EDataBookViewPrivate {
 	GArray *removes;
 
 	GHashTable *ids;
-	guint idle_id;
 
 	guint flush_id;
 
@@ -640,18 +639,16 @@ e_data_book_view_new (EDataBook *book,
 	return view;
 }
 
-static gboolean
-bookview_idle_start (gpointer data)
+static gpointer
+bookview_start_thread (gpointer data)
 {
 	EDataBookView *book_view = data;
 
-	book_view->priv->running = TRUE;
-	book_view->priv->complete = FALSE;
-	book_view->priv->idle_id = 0;
-
-	e_book_backend_start_book_view (book_view->priv->backend, book_view);
+	if (book_view->priv->running)
+		e_book_backend_start_book_view (book_view->priv->backend, book_view);
+	g_object_unref (book_view);
 
-	return FALSE;
+	return NULL;
 }
 
 static gboolean
@@ -659,25 +656,29 @@ impl_DataBookView_start (EGdbusBookView *object,
                          GDBusMethodInvocation *invocation,
                          EDataBookView *book_view)
 {
-	book_view->priv->idle_id = g_idle_add (bookview_idle_start, book_view);
+	GThread *thread;
+
+	book_view->priv->running = TRUE;
+	book_view->priv->complete = FALSE;
+
+	thread = g_thread_new (NULL, bookview_start_thread, g_object_ref (book_view));
+	g_thread_unref (thread);
 
 	e_gdbus_book_view_complete_start (object, invocation, NULL);
 
 	return TRUE;
 }
 
-static gboolean
-bookview_idle_stop (gpointer data)
+static gpointer
+bookview_stop_thread (gpointer data)
 {
 	EDataBookView *book_view = data;
 
-	e_book_backend_stop_book_view (book_view->priv->backend, book_view);
-
-	book_view->priv->running = FALSE;
-	book_view->priv->complete = FALSE;
-	book_view->priv->idle_id = 0;
+	if (!book_view->priv->running)
+		e_book_backend_stop_book_view (book_view->priv->backend, book_view);
+	g_object_unref (book_view);
 
-	return FALSE;
+	return NULL;
 }
 
 static gboolean
@@ -685,10 +686,13 @@ impl_DataBookView_stop (EGdbusBookView *object,
                         GDBusMethodInvocation *invocation,
                         EDataBookView *book_view)
 {
-	if (book_view->priv->idle_id)
-		g_source_remove (book_view->priv->idle_id);
+	GThread *thread;
 
-	book_view->priv->idle_id = g_idle_add (bookview_idle_stop, book_view);
+	book_view->priv->running = FALSE;
+	book_view->priv->complete = FALSE;
+
+	thread = g_thread_new (NULL, bookview_stop_thread, g_object_ref (book_view));
+	g_thread_unref (thread);
 
 	e_gdbus_book_view_complete_stop (object, invocation, NULL);
 
@@ -792,11 +796,6 @@ e_data_book_view_dispose (GObject *object)
 		priv->card_sexp = NULL;
 	}
 
-	if (priv->idle_id) {
-		g_source_remove (priv->idle_id);
-		priv->idle_id = 0;
-	}
-
 	g_mutex_lock (priv->pending_mutex);
 
 	if (priv->flush_id) {
diff --git a/calendar/libedata-cal/e-data-cal-view.c b/calendar/libedata-cal/e-data-cal-view.c
index 7915245..6ba33d2 100644
--- a/calendar/libedata-cal/e-data-cal-view.c
+++ b/calendar/libedata-cal/e-data-cal-view.c
@@ -431,6 +431,18 @@ notify_complete (EDataCalView *view,
 	g_strfreev (error_strv);
 }
 
+static gpointer
+calview_start_thread (gpointer data)
+{
+	EDataCalView *view = data;
+
+	if (view->priv->started && !view->priv->stopped)
+		e_cal_backend_start_view (view->priv->backend, view);
+	g_object_unref (view);
+
+	return NULL;
+}
+
 static gboolean
 impl_DataCalView_start (EGdbusCalView *object,
                         GDBusMethodInvocation *invocation,
@@ -441,9 +453,13 @@ impl_DataCalView_start (EGdbusCalView *object,
 	priv = view->priv;
 
 	if (!priv->started) {
+		GThread *thread;
+
 		priv->started = TRUE;
 		e_debug_log (FALSE, E_DEBUG_LOG_DOMAIN_CAL_QUERIES, "---;%p;VIEW-START;%s;%s", view, e_data_cal_view_get_text (view), G_OBJECT_TYPE_NAME (priv->backend));
-		e_cal_backend_start_view (priv->backend, view);
+
+		thread = g_thread_new (NULL, calview_start_thread, g_object_ref (view));
+		g_thread_unref (thread);
 	}
 
 	e_gdbus_cal_view_complete_start (object, invocation, NULL);
@@ -451,19 +467,34 @@ impl_DataCalView_start (EGdbusCalView *object,
 	return TRUE;
 }
 
+static gpointer
+calview_stop_thread (gpointer data)
+{
+	EDataCalView *view = data;
+
+	if (view->priv->stopped)
+		e_cal_backend_stop_view (view->priv->backend, view);
+	g_object_unref (view);
+
+	return NULL;
+}
+
 static gboolean
 impl_DataCalView_stop (EGdbusCalView *object,
                        GDBusMethodInvocation *invocation,
                        EDataCalView *view)
 {
 	EDataCalViewPrivate *priv;
+	GThread *thread;
 
 	priv = view->priv;
 
 	priv->stopped = TRUE;
 
+	thread = g_thread_new (NULL, calview_stop_thread, g_object_ref (view));
+	g_thread_unref (thread);
+
 	e_gdbus_cal_view_complete_stop (object, invocation, NULL);
-	e_cal_backend_stop_view (priv->backend, view);
 
 	return TRUE;
 }



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