[evolution-data-server] Start/stop book/cal views in a dedicated thread
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Start/stop book/cal views in a dedicated thread
- Date: Tue, 21 Aug 2012 13:24:48 +0000 (UTC)
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]