[glib/wip/async-io-perf: 3/3] GIOScheduler: Use a GList, not GSList for jobs
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/async-io-perf: 3/3] GIOScheduler: Use a GList, not GSList for jobs
- Date: Thu, 21 Jun 2012 16:47:49 +0000 (UTC)
commit 6e60011984cf068229fc1e84e57e9167c1cb2242
Author: Colin Walters <walters verbum org>
Date: Thu Jun 21 11:10:00 2012 -0400
GIOScheduler: Use a GList, not GSList for jobs
In general, code using g_slist_delete_link() is broken, because it
potentially requires an O(n) traversal. Just switch to GList in this
case.
The performance hit here was exacerbated by the fact that we were
holding a mutex that needed to be accessed by all threads.
gio/gioscheduler.c | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)
---
diff --git a/gio/gioscheduler.c b/gio/gioscheduler.c
index 8289018..f3e629c 100644
--- a/gio/gioscheduler.c
+++ b/gio/gioscheduler.c
@@ -45,7 +45,7 @@
**/
struct _GIOSchedulerJob {
- GSList *active_link;
+ GList *active_link;
GIOSchedulerJobFunc job_func;
GSourceFunc cancel_func; /* Runs under job map lock */
gpointer data;
@@ -57,7 +57,7 @@ struct _GIOSchedulerJob {
};
G_LOCK_DEFINE_STATIC(active_jobs);
-static GSList *active_jobs = NULL;
+static GList *active_jobs = NULL;
static GThreadPool *job_thread_pool = NULL;
@@ -142,7 +142,7 @@ job_destroy (gpointer data)
job->destroy_notify (job->data);
G_LOCK (active_jobs);
- active_jobs = g_slist_delete_link (active_jobs, job->active_link);
+ active_jobs = g_list_delete_link (active_jobs, job->active_link);
G_UNLOCK (active_jobs);
g_io_job_free (job);
}
@@ -215,7 +215,7 @@ g_io_scheduler_push_job (GIOSchedulerJobFunc job_func,
job->context = g_main_context_ref_thread_default ();
G_LOCK (active_jobs);
- active_jobs = g_slist_prepend (active_jobs, job);
+ active_jobs = g_list_prepend (active_jobs, job);
job->active_link = active_jobs;
G_UNLOCK (active_jobs);
@@ -234,7 +234,7 @@ g_io_scheduler_push_job (GIOSchedulerJobFunc job_func,
void
g_io_scheduler_cancel_all_jobs (void)
{
- GSList *cancellable_list, *l;
+ GList *cancellable_list, *l;
G_LOCK (active_jobs);
cancellable_list = NULL;
@@ -242,8 +242,8 @@ g_io_scheduler_cancel_all_jobs (void)
{
GIOSchedulerJob *job = l->data;
if (job->cancellable)
- cancellable_list = g_slist_prepend (cancellable_list,
- g_object_ref (job->cancellable));
+ cancellable_list = g_list_prepend (cancellable_list,
+ g_object_ref (job->cancellable));
}
G_UNLOCK (active_jobs);
@@ -253,7 +253,7 @@ g_io_scheduler_cancel_all_jobs (void)
g_cancellable_cancel (c);
g_object_unref (c);
}
- g_slist_free (cancellable_list);
+ g_list_free (cancellable_list);
}
typedef struct {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]