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