[Xfce4-commits] <tumbler:master> Added `scheduler` parameter to DBus method Queue

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


Updating branch refs/heads/master
         to c8240e613fe2da8d7f4c3ee50b75e6fa1ab8ae67 (commit)
       from bbb9f66d47f0fbb2028439a8eba32ffd794a9dd4 (commit)

commit c8240e613fe2da8d7f4c3ee50b75e6fa1ab8ae67
Author: Philip Van Hoof <philip at codeminded.be>
Date:   Tue Oct 6 16:43:11 2009 +0200

    Added `scheduler` parameter to DBus method Queue
    
    Signed-off-by: Jannis Pohlmann <jannis at xfce.org>

 tumblerd/tumbler-service-dbus.xml |    1 +
 tumblerd/tumbler-service.c        |   84 +++++++++++++++++++++++++------------
 tumblerd/tumbler-service.h        |    1 +
 3 files changed, 59 insertions(+), 27 deletions(-)

diff --git a/tumblerd/tumbler-service-dbus.xml b/tumblerd/tumbler-service-dbus.xml
index c040ceb..e898e19 100644
--- a/tumblerd/tumbler-service-dbus.xml
+++ b/tumblerd/tumbler-service-dbus.xml
@@ -5,6 +5,7 @@
       <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
       <arg type="as" name="uris" direction="in" />
       <arg type="as" name="mime_hints" direction="in" />
+      <arg type="s" name="scheduler" direction="in" />
       <arg type="u" name="handle_to_unqueue" direction="in" />
       <arg type="u" name="handle" direction="out" />
     </method>
diff --git a/tumblerd/tumbler-service.c b/tumblerd/tumbler-service.c
index 25ffc3c..eefd867 100644
--- a/tumblerd/tumbler-service.c
+++ b/tumblerd/tumbler-service.c
@@ -37,6 +37,7 @@
 #include <tumblerd/tumbler-service.h>
 #include <tumblerd/tumbler-service-dbus-bindings.h>
 #include <tumblerd/tumbler-lifo-scheduler.h>
+#include <tumblerd/tumbler-group-scheduler.h>
 #include <tumblerd/tumbler-utils.h>
 
 
@@ -100,7 +101,7 @@ struct _TumblerService
 
   DBusGConnection  *connection;
   TumblerRegistry  *registry;
-  TumblerScheduler *scheduler;
+  GPtrArray        *schedulers;
   GMutex           *mutex;
 };
 
@@ -198,9 +199,23 @@ static void
 tumbler_service_init (TumblerService *service)
 {
   service->mutex = g_mutex_new ();
+  service->schedulers = g_ptr_array_sized_new (2);
 }
 
+static void
+tumbler_service_add_scheduler (TumblerService *service, TumblerScheduler *scheduler)
+{
+  g_ptr_array_add (service->schedulers, scheduler);
 
+  g_signal_connect (scheduler, "error",
+                    G_CALLBACK (tumbler_service_scheduler_error), service);
+  g_signal_connect (scheduler, "finished", 
+                    G_CALLBACK (tumbler_service_scheduler_finished), service);
+  g_signal_connect (scheduler, "ready", 
+                    G_CALLBACK (tumbler_service_scheduler_ready), service);
+  g_signal_connect (scheduler, "started", 
+                    G_CALLBACK (tumbler_service_scheduler_started), service);
+}
 
 static void
 tumbler_service_constructed (GObject *object)
@@ -211,20 +226,8 @@ tumbler_service_constructed (GObject *object)
   if (G_OBJECT_CLASS (tumbler_service_parent_class)->constructed != NULL)
     (G_OBJECT_CLASS (tumbler_service_parent_class)->constructed) (object);
 
-#if 0
-  service->scheduler = tumbler_naive_scheduler_new ();
-#else
-  service->scheduler = tumbler_lifo_scheduler_new ("foreground");
-#endif
-
-  g_signal_connect (service->scheduler, "error",
-                    G_CALLBACK (tumbler_service_scheduler_error), service);
-  g_signal_connect (service->scheduler, "finished", 
-                    G_CALLBACK (tumbler_service_scheduler_finished), service);
-  g_signal_connect (service->scheduler, "ready", 
-                    G_CALLBACK (tumbler_service_scheduler_ready), service);
-  g_signal_connect (service->scheduler, "started", 
-                    G_CALLBACK (tumbler_service_scheduler_started), service);
+  tumbler_service_add_scheduler (service, tumbler_lifo_scheduler_new ("foreground"));
+  tumbler_service_add_scheduler (service, tumbler_group_scheduler_new ("background"));
 }
 
 
@@ -234,7 +237,9 @@ tumbler_service_finalize (GObject *object)
 {
   TumblerService *service = TUMBLER_SERVICE (object);
 
-  g_object_unref (service->scheduler);
+  g_ptr_array_foreach (service->schedulers, (GFunc) g_object_unref, NULL);
+  g_ptr_array_free (service->schedulers, TRUE);
+
   g_object_unref (service->registry);
 
   dbus_g_connection_unref (service->connection);
@@ -367,7 +372,7 @@ tumbler_service_start (TumblerService *service,
   connection = dbus_g_connection_get_connection (service->connection);
 
   /* request ownership for the generic thumbnailer interface */
-  result = dbus_bus_request_name (connection, "org.xfce.thumbnails.Thumbnailer",
+  result = dbus_bus_request_name (connection, "org.freedesktop.thumbnails.Thumbnailer",
                                   DBUS_NAME_FLAG_DO_NOT_QUEUE, &dbus_error);
 
   /* check if that failed */
@@ -398,7 +403,7 @@ tumbler_service_start (TumblerService *service,
 
   /* register the service instance as a handler of this interface */
   dbus_g_connection_register_g_object (service->connection, 
-                                       "/org/xfce/thumbnails/Thumbnailer", 
+                                       "/org/freedesktop/thumbnails/Thumbnailer", 
                                        G_OBJECT (service));
 
   g_mutex_unlock (service->mutex);
@@ -412,23 +417,25 @@ void
 tumbler_service_queue (TumblerService        *service,
                        const GStrv            uris,
                        const GStrv            mime_hints,
+                       const gchar           *s_scheduler,
                        guint                  handle_to_unqueue,
                        DBusGMethodInvocation *context)
 {
+  TumblerScheduler        *scheduler = NULL;
   TumblerSchedulerRequest *scheduler_request;
   TumblerThumbnailer     **thumbnailers;
   gint                     num_thumbnailers;
-  guint                    handle;
+  guint                    handle, i;
 
   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);
 
-  g_mutex_lock (service->mutex);
+  if (!s_scheduler || s_scheduler[0] == '\0') {
+    s_scheduler = "default";
+  }
 
-  /* unqueue the request with the given unqueue handle */
-  if (handle_to_unqueue != 0)
-    tumbler_scheduler_unqueue (service->scheduler, handle_to_unqueue);
+  g_mutex_lock (service->mutex);
 
   /* get an array with one thumbnailer for each URI in the request */
   thumbnailers = tumbler_registry_get_thumbnailer_array (service->registry,
@@ -442,8 +449,25 @@ 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_kind (sched);
+
+    /* unqueue the request with the given unqueue handle */
+    if (handle_to_unqueue != 0)
+      tumbler_scheduler_unqueue (sched, handle_to_unqueue);
+
+    if (g_ascii_strcasecmp (kind, s_scheduler) == 0)
+      scheduler = sched;
+
+  }
+
+  if (!scheduler) {
+    scheduler = g_ptr_array_index (service->schedulers, 0);
+  }
+
   /* push the request to the scheduler */
-  tumbler_scheduler_push (service->scheduler, scheduler_request);
+  tumbler_scheduler_push (scheduler, scheduler_request);
   
   /* free the thumbnailer array */
   tumbler_thumbnailer_array_free (thumbnailers, num_thumbnailers);
@@ -460,13 +484,19 @@ tumbler_service_unqueue (TumblerService        *service,
                          guint                  handle,
                          DBusGMethodInvocation *context)
 {
+  guint i;
+
   dbus_async_return_if_fail (TUMBLER_IS_SERVICE (service), context);
 
   g_mutex_lock (service->mutex);
 
-  /* unqueue the request with the given unqueue handle */
-  if (handle != 0)
-    tumbler_scheduler_unqueue (service->scheduler, handle);
+  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);
+    }
+  }
 
   g_mutex_unlock (service->mutex);
 
diff --git a/tumblerd/tumbler-service.h b/tumblerd/tumbler-service.h
index 44dd5be..3d45d89 100644
--- a/tumblerd/tumbler-service.h
+++ b/tumblerd/tumbler-service.h
@@ -46,6 +46,7 @@ gboolean        tumbler_service_start    (TumblerService        *service,
 void            tumbler_service_queue    (TumblerService        *service,
                                           const GStrv            uris,
                                           const GStrv            mime_hints,
+                                          const gchar           *s_scheduler,
                                           guint                  handle_to_unqueue,
                                           DBusGMethodInvocation *context);
 void            tumbler_service_unqueue (TumblerService         *service,



More information about the Xfce4-commits mailing list