[glib] Revert "GIOScheduler: Avoid constant iteration over pending job list"
- From: Ryan Lortie <ryanl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] Revert "GIOScheduler: Avoid constant iteration over pending job list"
- Date: Mon, 25 Jun 2012 20:55:16 +0000 (UTC)
commit 115ca3d8970ca32d824a201a9cc8f1fb24f3155e
Author: Ryan Lortie <desrt desrt ca>
Date: Mon Jun 25 10:37:51 2012 -0400
Revert "GIOScheduler: Avoid constant iteration over pending job list"
This reverts commit 2839297686a9305b4fa909b93c337ef1d1a5e94b.
Conflicts:
gio/gioscheduler.c
https://bugzilla.gnome.org/show_bug.cgi?id=678576
gio/gioscheduler.c | 41 ++++++++++++++++++++++++++---------------
1 files changed, 26 insertions(+), 15 deletions(-)
---
diff --git a/gio/gioscheduler.c b/gio/gioscheduler.c
index f3e629c..b94d8dd 100644
--- a/gio/gioscheduler.c
+++ b/gio/gioscheduler.c
@@ -120,17 +120,34 @@ init_scheduler (gpointer arg)
}
static void
-on_job_canceled (GCancellable *cancellable,
- gpointer user_data)
+remove_active_job (GIOSchedulerJob *job)
{
- GIOSchedulerJob *job = user_data;
-
- job->io_priority = -1;
-
- if (job_thread_pool != NULL)
+ GIOSchedulerJob *other_job;
+ GList *l;
+ gboolean resort_jobs;
+
+ G_LOCK (active_jobs);
+ active_jobs = g_list_delete_link (active_jobs, job->active_link);
+
+ resort_jobs = FALSE;
+ for (l = active_jobs; l != NULL; l = l->next)
+ {
+ other_job = l->data;
+ if (other_job->io_priority >= 0 &&
+ g_cancellable_is_cancelled (other_job->cancellable))
+ {
+ other_job->io_priority = -1;
+ resort_jobs = TRUE;
+ }
+ }
+ G_UNLOCK (active_jobs);
+
+ if (resort_jobs &&
+ job_thread_pool != NULL)
g_thread_pool_set_sort_function (job_thread_pool,
g_io_job_compare,
NULL);
+
}
static void
@@ -141,9 +158,7 @@ job_destroy (gpointer data)
if (job->destroy_notify)
job->destroy_notify (job->data);
- G_LOCK (active_jobs);
- active_jobs = g_list_delete_link (active_jobs, job->active_link);
- G_UNLOCK (active_jobs);
+ remove_active_job (job);
g_io_job_free (job);
}
@@ -206,11 +221,7 @@ g_io_scheduler_push_job (GIOSchedulerJobFunc job_func,
job->io_priority = io_priority;
if (cancellable)
- {
- job->cancellable = g_object_ref (cancellable);
- g_cancellable_connect (job->cancellable, (GCallback)on_job_canceled,
- job, NULL);
- }
+ job->cancellable = g_object_ref (cancellable);
job->context = g_main_context_ref_thread_default ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]