From 8228f7f94bb33a27273d9e517e6bb52b2c1cf130 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 25 Jan 2008 14:40:54 +0000 Subject: [PATCH] Make GIOSchedulerJobFunc return boolean Keep calling io jobs until they 2008-01-25 Matthias Clasen * gioscheduler.h: Make GIOSchedulerJobFunc return boolean * gioscheduler.c: Keep calling io jobs until they return FALSE; this allows big jobs to be executed in chunks, instead of blocking the main loop for a long time. * gsimpleasyncresult.c: * giofile.c: Adapt callers. svn path=/trunk/; revision=6375 --- gio/ChangeLog | 10 ++++++++++ gio/gfile.c | 12 ++++++----- gio/gioscheduler.c | 43 ++++++++++++++++++++++++---------------- gio/gioscheduler.h | 9 ++++++--- gio/gsimpleasyncresult.c | 10 ++++++---- 5 files changed, 55 insertions(+), 29 deletions(-) diff --git a/gio/ChangeLog b/gio/ChangeLog index 905fe8e71..0a126e664 100644 --- a/gio/ChangeLog +++ b/gio/ChangeLog @@ -1,3 +1,13 @@ +2008-01-25 Matthias Clasen + + * gioscheduler.h: Make GIOSchedulerJobFunc return boolean + * gioscheduler.c: Keep calling io jobs until they return FALSE; + this allows big jobs to be executed in chunks, instead of blocking + the main loop for a long time. + + * gsimpleasyncresult.c: + * giofile.c: Adapt callers. + 2008-01-25 Alexander Larsson * gdesktopappinfo.c: diff --git a/gio/gfile.c b/gio/gfile.c index e1d9a9546..69c29319c 100644 --- a/gio/gfile.c +++ b/gio/gfile.c @@ -4273,8 +4273,8 @@ mainloop_barrier (gpointer user_data) static void -copy_async_progress_callback (goffset current_num_bytes, - goffset total_num_bytes, +copy_async_progress_callback (goffset current_num_bytes, + goffset total_num_bytes, gpointer user_data) { CopyAsyncData *data = user_data; @@ -4291,10 +4291,10 @@ copy_async_progress_callback (goffset current_num_bytes, g_free); } -static void +static gboolean copy_async_thread (GIOSchedulerJob *job, - GCancellable *cancellable, - gpointer user_data) + GCancellable *cancellable, + gpointer user_data) { GSimpleAsyncResult *res; CopyAsyncData *data; @@ -4327,6 +4327,8 @@ copy_async_thread (GIOSchedulerJob *job, } g_simple_async_result_complete_in_idle (res); + + return FALSE; } static void diff --git a/gio/gioscheduler.c b/gio/gioscheduler.c index 8ec6aea1a..8184fc790 100644 --- a/gio/gioscheduler.c +++ b/gio/gioscheduler.c @@ -152,45 +152,54 @@ remove_active_job (GIOSchedulerJob *job) } static void -io_job_thread (gpointer data, - gpointer user_data) +job_destroy (gpointer data) { GIOSchedulerJob *job = data; - if (job->cancellable) - g_cancellable_push_current (job->cancellable); - job->job_func (job, job->cancellable, job->data); - if (job->cancellable) - g_cancellable_pop_current (job->cancellable); - if (job->destroy_notify) job->destroy_notify (job->data); remove_active_job (job); g_io_job_free (job); +} +static void +io_job_thread (gpointer data, + gpointer user_data) +{ + GIOSchedulerJob *job = data; + gboolean result; + + if (job->cancellable) + g_cancellable_push_current (job->cancellable); + + do + { + result = job->job_func (job, job->cancellable, job->data); + } + while (result); + + if (job->cancellable) + g_cancellable_pop_current (job->cancellable); + + job_destroy (job); } static gboolean run_job_at_idle (gpointer data) { GIOSchedulerJob *job = data; + gboolean result; if (job->cancellable) g_cancellable_push_current (job->cancellable); - job->job_func (job, job->cancellable, job->data); + result = job->job_func (job, job->cancellable, job->data); if (job->cancellable) g_cancellable_pop_current (job->cancellable); - if (job->destroy_notify) - job->destroy_notify (job->data); - - remove_active_job (job); - g_io_job_free (job); - - return FALSE; + return result; } /** @@ -249,7 +258,7 @@ g_io_scheduler_push_job (GIOSchedulerJobFunc job_func, */ job->idle_tag = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE + 1 + io_priority / 10, run_job_at_idle, - job, NULL); + job, job_destroy); } } diff --git a/gio/gioscheduler.h b/gio/gioscheduler.h index c33cee8fe..03c7f94f0 100644 --- a/gio/gioscheduler.h +++ b/gio/gioscheduler.h @@ -53,10 +53,13 @@ typedef struct _GIOSchedulerJob GIOSchedulerJob; * * Long-running jobs should periodically check the @cancellable * to see if they have been cancelled. + * + * Returns: %TRUE if this function should be called again to + * complete the job, %FALSE if the job is complete (or cancelled) **/ -typedef void (*GIOSchedulerJobFunc) (GIOSchedulerJob *job, - GCancellable *cancellable, - gpointer user_data); +typedef gboolean (*GIOSchedulerJobFunc) (GIOSchedulerJob *job, + GCancellable *cancellable, + gpointer user_data); void g_io_scheduler_push_job (GIOSchedulerJobFunc job_func, gpointer user_data, diff --git a/gio/gsimpleasyncresult.c b/gio/gsimpleasyncresult.c index 443c3b9ee..793da3dae 100644 --- a/gio/gsimpleasyncresult.c +++ b/gio/gsimpleasyncresult.c @@ -595,10 +595,10 @@ typedef struct { GSimpleAsyncThreadFunc func; } RunInThreadData; -static void -run_in_thread (GIOSchedulerJob *job, - GCancellable *c, - gpointer _data) +static gboolean +run_in_thread (GIOSchedulerJob *job, + GCancellable *c, + gpointer _data) { RunInThreadData *data = _data; GSimpleAsyncResult *simple = data->simple; @@ -617,6 +617,8 @@ run_in_thread (GIOSchedulerJob *job, g_simple_async_result_complete_in_idle (data->simple); g_object_unref (data->simple); g_free (data); + + return FALSE; } /**