Blame SOURCES/evolution-data-server-3.12.11-camel-session-no-gtask.patch

0da626
diff -up evolution-data-server-3.12.11/camel/camel-session.c.camel-session-no-gtask evolution-data-server-3.12.11/camel/camel-session.c
0da626
--- evolution-data-server-3.12.11/camel/camel-session.c.camel-session-no-gtask	2014-06-06 16:08:31.000000000 +0200
0da626
+++ evolution-data-server-3.12.11/camel/camel-session.c	2016-03-07 14:07:00.120347982 +0100
0da626
@@ -96,6 +96,8 @@ struct _JobData {
0da626
 	CamelSessionCallback callback;
0da626
 	gpointer user_data;
0da626
 	GDestroyNotify notify;
0da626
+	GMainContext *main_context;
0da626
+	GError *error;
0da626
 };
0da626
 
0da626
 enum {
0da626
@@ -154,6 +156,10 @@ job_data_free (JobData *job_data)
0da626
 {
0da626
 	g_object_unref (job_data->session);
0da626
 	g_object_unref (job_data->cancellable);
0da626
+	g_clear_error (&job_data->error);
0da626
+
0da626
+	if (job_data->main_context)
0da626
+		g_main_context_unref (job_data->main_context);
0da626
 
0da626
 	if (job_data->notify != NULL)
0da626
 		job_data->notify (job_data->user_data);
0da626
@@ -161,74 +167,65 @@ job_data_free (JobData *job_data)
0da626
 	g_slice_free (JobData, job_data);
0da626
 }
0da626
 
0da626
-static void
0da626
-session_finish_job_cb (GObject *source_object,
0da626
-                       GAsyncResult *result,
0da626
-                       gpointer unused)
0da626
+static gboolean
0da626
+session_finish_job_cb (gpointer user_data)
0da626
 {
0da626
-	GCancellable *cancellable;
0da626
-	GError *local_error = NULL;
0da626
+	JobData *job_data = (JobData *) user_data;
0da626
 
0da626
-	cancellable = g_task_get_cancellable (G_TASK (result));
0da626
-
0da626
-	/* XXX Ignore the return value, this is just
0da626
-	 *     to extract the GError if there is one. */
0da626
-	g_task_propagate_boolean (G_TASK (result), &local_error);
0da626
+	g_return_val_if_fail (job_data != NULL, FALSE);
0da626
 
0da626
 	g_signal_emit (
0da626
-		CAMEL_SESSION (source_object),
0da626
+		job_data->session,
0da626
 		signals[JOB_FINISHED], 0,
0da626
-		cancellable, local_error);
0da626
+		job_data->cancellable, job_data->error);
0da626
 
0da626
-	g_clear_error (&local_error);
0da626
+	return FALSE;
0da626
 }
0da626
 
0da626
 static void
0da626
-session_do_job_cb (GTask *task,
0da626
-                   gpointer source_object,
0da626
-                   gpointer task_data,
0da626
-                   GCancellable *cancellable)
0da626
+session_job_thread (gpointer data,
0da626
+		    gpointer user_data)
0da626
 {
0da626
-	JobData *job_data;
0da626
-	GError *local_error = NULL;
0da626
+	JobData *job_data = (JobData *) data;
0da626
+	GSource *source;
0da626
 
0da626
-	job_data = (JobData *) task_data;
0da626
+	g_return_if_fail (job_data != NULL);
0da626
 
0da626
 	job_data->callback (
0da626
-		CAMEL_SESSION (source_object),
0da626
-		cancellable,
0da626
+		job_data->session,
0da626
+		job_data->cancellable,
0da626
 		job_data->user_data,
0da626
-		&local_error);
0da626
+		&job_data->error);
0da626
 
0da626
-	if (local_error != NULL) {
0da626
-		g_task_return_error (task, local_error);
0da626
-	} else {
0da626
-		g_task_return_boolean (task, TRUE);
0da626
-	}
0da626
+	source = g_idle_source_new ();
0da626
+	g_source_set_priority (source, G_PRIORITY_DEFAULT);
0da626
+	g_source_set_callback (source, session_finish_job_cb, job_data, (GDestroyNotify) job_data_free);
0da626
+	g_source_attach (source, job_data->main_context);
0da626
+	g_source_unref (source);
0da626
 }
0da626
 
0da626
 static gboolean
0da626
 session_start_job_cb (gpointer user_data)
0da626
 {
0da626
+	static GThreadPool *job_pool = NULL;
0da626
+	static GMutex job_pool_mutex;
0da626
 	JobData *job_data = user_data;
0da626
-	GTask *task;
0da626
 
0da626
 	g_signal_emit (
0da626
 		job_data->session,
0da626
 		signals[JOB_STARTED], 0,
0da626
 		job_data->cancellable);
0da626
 
0da626
-	task = g_task_new (
0da626
-		job_data->session,
0da626
-		job_data->cancellable,
0da626
-		session_finish_job_cb, NULL);
0da626
+	g_mutex_lock (&job_pool_mutex);
0da626
+
0da626
+	if (!job_pool)
0da626
+		job_pool = g_thread_pool_new (session_job_thread, NULL, 20, FALSE, NULL);
0da626
 
0da626
-	g_task_set_task_data (
0da626
-		task, job_data, (GDestroyNotify) job_data_free);
0da626
+	job_data->main_context = g_main_context_ref_thread_default ();
0da626
 
0da626
-	g_task_run_in_thread (task, session_do_job_cb);
0da626
+	g_thread_pool_push (job_pool, job_data, NULL);
0da626
 
0da626
-	g_object_unref (task);
0da626
+	g_mutex_unlock (&job_pool_mutex);
0da626
 
0da626
 	return FALSE;
0da626
 }
0da626
@@ -1450,6 +1447,8 @@ camel_session_submit_job (CamelSession *
0da626
 	job_data->callback = callback;
0da626
 	job_data->user_data = user_data;
0da626
 	job_data->notify = notify;
0da626
+	job_data->main_context = NULL;
0da626
+	job_data->error = NULL;
0da626
 
0da626
 	camel_session_idle_add (
0da626
 		session, JOB_PRIORITY,