Updating branch refs/heads/master to 779937857784d4043a6a3023280303efc723c4bf (commit) from aec1c8ac7b4c5089210ff648fd53dba23b172c01 (commit)
commit 779937857784d4043a6a3023280303efc723c4bf Author: Jannis Pohlmann <jan...@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); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits