glib r6375 - trunk/gio
- From: matthiasc svn gnome org
- To: svn-commits-list gnome org
- Subject: glib r6375 - trunk/gio
- Date: Fri, 25 Jan 2008 14:40:54 +0000 (GMT)
Author: matthiasc
Date: Fri Jan 25 14:40:54 2008
New Revision: 6375
URL: http://svn.gnome.org/viewvc/glib?rev=6375&view=rev
Log:
2008-01-25 Matthias Clasen <mclasen redhat com>
* 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.
Modified:
trunk/gio/ChangeLog
trunk/gio/gfile.c
trunk/gio/gioscheduler.c
trunk/gio/gioscheduler.h
trunk/gio/gsimpleasyncresult.c
Modified: trunk/gio/gfile.c
==============================================================================
--- trunk/gio/gfile.c (original)
+++ trunk/gio/gfile.c Fri Jan 25 14:40:54 2008
@@ -4273,8 +4273,8 @@
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 @@
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 @@
}
g_simple_async_result_complete_in_idle (res);
+
+ return FALSE;
}
static void
Modified: trunk/gio/gioscheduler.c
==============================================================================
--- trunk/gio/gioscheduler.c (original)
+++ trunk/gio/gioscheduler.c Fri Jan 25 14:40:54 2008
@@ -152,45 +152,54 @@
}
static void
+job_destroy (gpointer data)
+{
+ GIOSchedulerJob *job = data;
+
+ 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);
- 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);
+ do
+ {
+ result = job->job_func (job, job->cancellable, job->data);
+ }
+ while (result);
- remove_active_job (job);
- g_io_job_free (job);
+ 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 @@
*/
job->idle_tag = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE + 1 + io_priority / 10,
run_job_at_idle,
- job, NULL);
+ job, job_destroy);
}
}
Modified: trunk/gio/gioscheduler.h
==============================================================================
--- trunk/gio/gioscheduler.h (original)
+++ trunk/gio/gioscheduler.h Fri Jan 25 14:40:54 2008
@@ -53,10 +53,13 @@
*
* 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,
Modified: trunk/gio/gsimpleasyncresult.c
==============================================================================
--- trunk/gio/gsimpleasyncresult.c (original)
+++ trunk/gio/gsimpleasyncresult.c Fri Jan 25 14:40:54 2008
@@ -595,10 +595,10 @@
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 @@
g_simple_async_result_complete_in_idle (data->simple);
g_object_unref (data->simple);
g_free (data);
+
+ return FALSE;
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]