|
|
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,
|