glib r6375 - trunk/gio



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]