[Xfce4-commits] <tumbler:master> Use a GList for managing the schedulers. Rework the service code a bit.

Jannis Pohlmann noreply at xfce.org
Tue Oct 6 20:54:09 CEST 2009


Updating branch refs/heads/master
         to 779937857784d4043a6a3023280303efc723c4bf (commit)
       from aec1c8ac7b4c5089210ff648fd53dba23b172c01 (commit)

commit 779937857784d4043a6a3023280303efc723c4bf
Author: Jannis Pohlmann <jannis at xfce.org>
Date:   Tue Oct 6 20:49:43 2009 +0200

    Use a GList for managing the schedulers. Rework the service code a bit.

 tumblerd/tumbler-service.c |  105 +++++++++++++++++++++++++++++---------------
 1 files changed, 69 insertions(+), 36 deletions(-)

diff --git a/tumblerd/tumbler-service.c b/tumblerd/tumbler-service.c
index 3f07f9b..40b7420 100644
--- a/tumblerd/tumbler-service.c
+++ b/tumblerd/tumbler-service.c
@@ -101,8 +101,8 @@ struct _TumblerService
 
   DBusGConnection  *connection;
   TumblerRegistry  *registry;
-  GPtrArray        *schedulers;
   GMutex           *mutex;
+  GList            *schedulers;
 };
 
 
@@ -199,14 +199,19 @@ static void
 tumbler_service_init (TumblerService *service)
 {
   service->mutex = g_mutex_new ();
-  service->schedulers = g_ptr_array_sized_new (2);
+  service->schedulers = NULL;
 }
 
+
+
 static void
-tumbler_service_add_scheduler (TumblerService *service, TumblerScheduler *scheduler)
+tumbler_service_add_scheduler (TumblerService   *service, 
+                               TumblerScheduler *scheduler)
 {
-  g_ptr_array_add (service->schedulers, scheduler);
+  /* add the scheduler to the list */
+  service->schedulers = g_list_prepend (service->schedulers, g_object_ref (scheduler));
 
+  /* connect to the scheduler signals */
   g_signal_connect (scheduler, "error",
                     G_CALLBACK (tumbler_service_scheduler_error), service);
   g_signal_connect (scheduler, "finished", 
@@ -217,17 +222,27 @@ tumbler_service_add_scheduler (TumblerService *service, TumblerScheduler *schedu
                     G_CALLBACK (tumbler_service_scheduler_started), service);
 }
 
+
+
 static void
 tumbler_service_constructed (GObject *object)
 {
-  TumblerService *service = TUMBLER_SERVICE (object);
+  TumblerService   *service = TUMBLER_SERVICE (object);
+  TumblerScheduler *scheduler;
 
   /* chain up to parent classes */
   if (G_OBJECT_CLASS (tumbler_service_parent_class)->constructed != NULL)
     (G_OBJECT_CLASS (tumbler_service_parent_class)->constructed) (object);
 
-  tumbler_service_add_scheduler (service, tumbler_lifo_scheduler_new ("foreground"));
-  tumbler_service_add_scheduler (service, tumbler_group_scheduler_new ("background"));
+  /* create the background scheduler */
+  scheduler = tumbler_group_scheduler_new ("background");
+  tumbler_service_add_scheduler (service, scheduler);
+  g_object_unref (scheduler);
+
+  /* create the foreground scheduler */
+  scheduler = tumbler_lifo_scheduler_new ("foreground");
+  tumbler_service_add_scheduler (service, scheduler);
+  g_object_unref (scheduler);
 }
 
 
@@ -237,9 +252,11 @@ tumbler_service_finalize (GObject *object)
 {
   TumblerService *service = TUMBLER_SERVICE (object);
 
-  g_ptr_array_foreach (service->schedulers, (GFunc) g_object_unref, NULL);
-  g_ptr_array_free (service->schedulers, TRUE);
+  /* release all schedulers and the scheduler list */
+  g_list_foreach (service->schedulers, (GFunc) g_object_unref, NULL);
+  g_list_free (service->schedulers);
 
+  /* release the reference on the thumbnailer registry */
   g_object_unref (service->registry);
 
   dbus_g_connection_unref (service->connection);
@@ -307,8 +324,8 @@ tumbler_service_scheduler_error (TumblerScheduler *scheduler,
                                  const gchar      *message,
                                  TumblerService   *service)
 {
-  g_signal_emit (service, tumbler_service_signals[SIGNAL_ERROR], 0, handle, failed_uris, 
-                 error_code, message);
+  g_signal_emit (service, tumbler_service_signals[SIGNAL_ERROR], 0, 
+                 handle, failed_uris, error_code, message);
 }
 
 
@@ -417,23 +434,29 @@ void
 tumbler_service_queue (TumblerService        *service,
                        const GStrv            uris,
                        const GStrv            mime_hints,
-                       const gchar           *s_scheduler,
+                       const gchar           *desired_scheduler,
                        guint                  handle_to_unqueue,
                        DBusGMethodInvocation *context)
 {
   TumblerScheduler        *scheduler = NULL;
   TumblerSchedulerRequest *scheduler_request;
   TumblerThumbnailer     **thumbnailers;
+  GList                   *iter;
+  gchar                   *name;
+  guint                    handle;
   gint                     num_thumbnailers;
-  guint                    handle, i;
+
+  g_debug ("tumbler_service_queue:");
 
   dbus_async_return_if_fail (TUMBLER_IS_SERVICE (service), context);
   dbus_async_return_if_fail (uris != NULL, context);
   dbus_async_return_if_fail (mime_hints != NULL, context);
 
-  if (!s_scheduler || s_scheduler[0] == '\0') {
-    s_scheduler = "default";
-  }
+  /* if the scheduler is not defined, fall back to "default" */
+  if (desired_scheduler == NULL || *desired_scheduler == '\0')
+    desired_scheduler = "default";
+
+  g_debug ("%s", desired_scheduler);
 
   g_mutex_lock (service->mutex);
 
@@ -449,24 +472,31 @@ tumbler_service_queue (TumblerService        *service,
   /* get the request handle */
   handle = scheduler_request->handle;
 
-  for (i = 0; i < service->schedulers->len; i++) {
-    TumblerScheduler *sched = g_ptr_array_index (service->schedulers, i);
-    const gchar *kind = tumbler_scheduler_get_name (sched);
+  /* iterate over all schedulers */
+  for (iter = service->schedulers; iter != NULL; iter = iter->next)
+    {
+      /* unqueue the request with the given unqueue handle, in case this 
+       * scheduler is responsible for the given handle */
+      if (handle_to_unqueue != 0)
+        tumbler_scheduler_unqueue (TUMBLER_SCHEDULER (iter->data), handle_to_unqueue);
 
-    /* unqueue the request with the given unqueue handle */
-    if (handle_to_unqueue != 0)
-      tumbler_scheduler_unqueue (sched, handle_to_unqueue);
+      /* determine the scheduler name */
+      name = tumbler_scheduler_get_name (TUMBLER_SCHEDULER (iter->data));
 
-    if (g_ascii_strcasecmp (kind, s_scheduler) == 0)
-      scheduler = sched;
+      /* check if this is the scheduler we are looking for */
+      if (g_strcmp0 (name, desired_scheduler) == 0)
+        scheduler = TUMBLER_SCHEDULER (iter->data);
 
-  }
+      /* free the scheduler name */
+      g_free (name);
+    }
 
-  if (!scheduler) {
-    scheduler = g_ptr_array_index (service->schedulers, 0);
-  }
+  /* default to the first scheduler in the list if we couldn't find
+   * the scheduler with the desired name */
+  if (scheduler == NULL) 
+    scheduler = TUMBLER_SCHEDULER (service->schedulers->data);
 
-  /* push the request to the scheduler */
+  /* let the scheduler take it from here */
   tumbler_scheduler_push (scheduler, scheduler_request);
   
   /* free the thumbnailer array */
@@ -484,19 +514,22 @@ tumbler_service_unqueue (TumblerService        *service,
                          guint                  handle,
                          DBusGMethodInvocation *context)
 {
-  guint i;
+  GList *iter;
 
   dbus_async_return_if_fail (TUMBLER_IS_SERVICE (service), context);
 
   g_mutex_lock (service->mutex);
 
-  if (handle != 0) {
-    for (i = 0; i < service->schedulers->len; i++) {
-      TumblerScheduler *sched = g_ptr_array_index (service->schedulers, i);
-      /* unqueue the request with the given unqueue handle */
-      tumbler_scheduler_unqueue (sched, handle);
+  if (handle != 0) 
+    {
+      /* iterate over all available schedulers */
+      for (iter = service->schedulers; iter != NULL; iter = iter->next)
+        {
+          /* unqueue the request with the given unqueue handle, in case this
+           * scheduler is responsible for the given handle */
+          tumbler_scheduler_unqueue (TUMBLER_SCHEDULER (iter->data), handle);
+        }
     }
-  }
 
   g_mutex_unlock (service->mutex);
 



More information about the Xfce4-commits mailing list