[Xfce4-commits] <tumbler:master> Update the comments for the LIFO scheduler. Minor coding style changes.
Jannis Pohlmann
noreply at xfce.org
Tue Oct 6 20:54:10 CEST 2009
Updating branch refs/heads/master
to 437b6b40d0fce61358e1a0ed6ae83b1929a550fe (commit)
from 779937857784d4043a6a3023280303efc723c4bf (commit)
commit 437b6b40d0fce61358e1a0ed6ae83b1929a550fe
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Tue Oct 6 20:50:38 2009 +0200
Update the comments for the LIFO scheduler. Minor coding style changes.
tumblerd/tumbler-lifo-scheduler.c | 109 +++++++++++++++++++++----------------
tumblerd/tumbler-lifo-scheduler.h | 2 +
2 files changed, 65 insertions(+), 46 deletions(-)
diff --git a/tumblerd/tumbler-lifo-scheduler.c b/tumblerd/tumbler-lifo-scheduler.c
index 31b9276..3335eb5 100644
--- a/tumblerd/tumbler-lifo-scheduler.c
+++ b/tumblerd/tumbler-lifo-scheduler.c
@@ -1,6 +1,8 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2009 Jannis Pohlmann <jannis at xfce.org>
+ * Copyright (c) 2009 Nokia,
+ * written by Philip Van Hoof <philip at codeminded.be>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -44,31 +46,31 @@ enum
static void tumbler_lifo_scheduler_iface_init (TumblerSchedulerIface *iface);
static void tumbler_lifo_scheduler_finalize (GObject *object);
static void tumbler_lifo_scheduler_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
static void tumbler_lifo_scheduler_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
static void tumbler_lifo_scheduler_push (TumblerScheduler *scheduler,
- TumblerSchedulerRequest *request);
+ TumblerSchedulerRequest *request);
static void tumbler_lifo_scheduler_unqueue (TumblerScheduler *scheduler,
- guint handle);
+ guint handle);
static void tumbler_lifo_scheduler_finish_request (TumblerLifoScheduler *scheduler,
- TumblerSchedulerRequest *request);
+ TumblerSchedulerRequest *request);
static void tumbler_lifo_scheduler_unqueue_request (TumblerSchedulerRequest *request,
- gpointer user_data);
+ gpointer user_data);
static void tumbler_lifo_scheduler_thread (gpointer data,
- gpointer user_data);
+ gpointer user_data);
static void tumbler_lifo_scheduler_thumbnailer_error (TumblerThumbnailer *thumbnailer,
- const gchar *failed_uri,
- gint error_code,
- const gchar *message,
- TumblerSchedulerRequest *request);
+ const gchar *failed_uri,
+ gint error_code,
+ const gchar *message,
+ TumblerSchedulerRequest *request);
static void tumbler_lifo_scheduler_thumbnailer_ready (TumblerThumbnailer *thumbnailer,
- const gchar *uri,
- TumblerSchedulerRequest *request);
+ const gchar *uri,
+ TumblerSchedulerRequest *request);
@@ -84,7 +86,7 @@ struct _TumblerLifoScheduler
GThreadPool *pool;
GMutex *mutex;
GList *requests;
- guint lifo;
+
gchar *name;
};
@@ -130,12 +132,12 @@ tumbler_lifo_scheduler_init (TumblerLifoScheduler *scheduler)
scheduler->mutex = g_mutex_new ();
scheduler->requests = NULL;
- /* allocate a pool with max. 2 threads for request with <= lifo URIs */
+ /* allocate a thread pool with a maximum of one thread */
scheduler->pool = g_thread_pool_new (tumbler_lifo_scheduler_thread,
scheduler, 1, TRUE, NULL);
/* make the thread a LIFO */
- g_thread_pool_set_sort_function (scheduler->pool,
+ g_thread_pool_set_sort_function (scheduler->pool,
tumbler_scheduler_request_compare, NULL);
}
@@ -155,6 +157,7 @@ tumbler_lifo_scheduler_finalize (GObject *object)
/* destroy the request list */
g_list_free (scheduler->requests);
+ /* free the scheduler name */
g_free (scheduler->name);
/* destroy the mutex */
@@ -211,8 +214,7 @@ static void
tumbler_lifo_scheduler_push (TumblerScheduler *scheduler,
TumblerSchedulerRequest *request)
{
- TumblerLifoScheduler *lifo_scheduler =
- TUMBLER_LIFO_SCHEDULER (scheduler);
+ TumblerLifoScheduler *lifo_scheduler = TUMBLER_LIFO_SCHEDULER (scheduler);
g_return_if_fail (TUMBLER_IS_LIFO_SCHEDULER (scheduler));
g_return_if_fail (request != NULL);
@@ -223,8 +225,7 @@ tumbler_lifo_scheduler_push (TumblerScheduler *scheduler,
tumbler_scheduler_take_request (scheduler, request);
/* prepend the request to the request list */
- lifo_scheduler->requests =
- g_list_prepend (lifo_scheduler->requests, request);
+ lifo_scheduler->requests = g_list_prepend (lifo_scheduler->requests, request);
/* enqueue the request in the pool */
g_thread_pool_push (lifo_scheduler->pool, request, NULL);
@@ -246,6 +247,7 @@ tumbler_lifo_scheduler_unqueue (TumblerScheduler *scheduler,
g_mutex_lock (lifo_scheduler->mutex);
+ /* unqueue all requests (usually only one) with this handle */
g_list_foreach (lifo_scheduler->requests,
(GFunc) tumbler_lifo_scheduler_unqueue_request,
GUINT_TO_POINTER (handle));
@@ -262,11 +264,13 @@ tumbler_lifo_scheduler_finish_request (TumblerLifoScheduler *scheduler,
g_return_if_fail (TUMBLER_IS_LIFO_SCHEDULER (scheduler));
g_return_if_fail (request != NULL);
+ /* emit a finished signal for this request */
g_signal_emit_by_name (scheduler, "finished", request->handle);
- scheduler->requests = g_list_remove (scheduler->requests,
- request);
+ /* remove the request from the list */
+ scheduler->requests = g_list_remove (scheduler->requests, request);
+ /* destroy the request since we no longer need it */
tumbler_scheduler_request_free (request);
}
@@ -281,6 +285,7 @@ tumbler_lifo_scheduler_unqueue_request (TumblerSchedulerRequest *request,
g_return_if_fail (request != NULL);
g_return_if_fail (handle != 0);
+ /* mark the request as unqueued if the handles match */
if (request->handle == handle)
request->unqueued = TRUE;
}
@@ -291,19 +296,19 @@ static void
tumbler_lifo_scheduler_thread (gpointer data,
gpointer user_data)
{
- TumblerLifoScheduler *scheduler = user_data;
- TumblerSchedulerRequest *request = data;
- TumblerFileInfo *info;
- const gchar **uris;
- gboolean outdated;
- gboolean uri_needs_update;
- guint64 mtime;
- GError *error = NULL;
- GList *cached_uris = NULL;
- GList *missing_uris = NULL;
- GList *thumbnails;
- GList *lp;
- gint n;
+ TumblerSchedulerRequest *request = data;
+ TumblerLifoScheduler *scheduler = user_data;
+ TumblerFileInfo *info;
+ const gchar **uris;
+ gboolean outdated;
+ gboolean uri_needs_update;
+ guint64 mtime;
+ GError *error = NULL;
+ GList *cached_uris = NULL;
+ GList *missing_uris = NULL;
+ GList *thumbnails;
+ GList *lp;
+ gint n;
g_return_if_fail (TUMBLER_IS_LIFO_SCHEDULER (scheduler));
g_return_if_fail (request != NULL);
@@ -311,8 +316,7 @@ tumbler_lifo_scheduler_thread (gpointer data,
/* notify others that we're starting to process this request */
g_signal_emit_by_name (request->scheduler, "started", request->handle);
-
- /* finish the request if it was unqueued */
+ /* finish the request if it was already unqueued */
if (request->unqueued)
{
g_mutex_lock (scheduler->mutex);
@@ -333,47 +337,59 @@ tumbler_lifo_scheduler_thread (gpointer data,
return;
}
+ /* create a file info for the current URI */
info = tumbler_file_info_new (request->uris[n]);
uri_needs_update = FALSE;
G_LOCK (plugin_access_lock);
+ /* try to load thumbnail information about the URI */
if (tumbler_file_info_load (info, NULL, &error))
{
+ /* check if we have a thumbnailer for the URI */
if (request->thumbnailers[n] != NULL)
{
+ /* compute the last modification time of the URI */
mtime = tumbler_file_info_get_mtime (info);
+ /* get a list of all thumbnails for this URI */
thumbnails = tumbler_file_info_get_thumbnails (info);
- for (lp = thumbnails;
- error == NULL && lp != NULL;
- lp = lp->next)
+ /* iterate over them */
+ for (lp = thumbnails; error == NULL && lp != NULL; lp = lp->next)
{
+ /* try to load the thumbnail information */
if (tumbler_thumbnail_load (lp->data, NULL, &error))
{
+ /* check if the thumbnail needs an update */
outdated = tumbler_thumbnail_needs_update (lp->data,
request->uris[n],
mtime);
+ /* if at least one thumbnail is out of date, we need to
+ * regenerate thumbnails for the URI */
uri_needs_update = uri_needs_update || outdated;
}
}
}
else
{
+ /* no thumbnailer for this URI, we need to emit an error */
g_set_error (&error, TUMBLER_ERROR, TUMBLER_ERROR_NO_THUMBNAILER,
_("No thumbnailer available for \"%s\""),
request->uris[n]);
}
}
+ /* release the file info */
g_object_unref (info);
G_UNLOCK (plugin_access_lock);
+ /* check if the URI is supported */
if (error == NULL)
{
+ /* put it in the right list depending on its thumbnail status */
if (uri_needs_update)
missing_uris = g_list_prepend (missing_uris, GINT_TO_POINTER (n));
else
@@ -381,9 +397,9 @@ tumbler_lifo_scheduler_thread (gpointer data,
}
else
{
+ /* emit an error for the URI */
tumbler_scheduler_emit_uri_error (TUMBLER_SCHEDULER (scheduler), request,
request->uris[n], error);
-
g_clear_error (&error);
}
}
@@ -391,6 +407,7 @@ tumbler_lifo_scheduler_thread (gpointer data,
/* check if we have any cached files */
if (cached_uris != NULL)
{
+ /* allocate a URI array and fill it with all cached URIs */
uris = g_new0 (const gchar *, g_list_length (cached_uris) + 1);
for (n = 0, lp = g_list_last (cached_uris); lp != NULL; lp = lp->prev, ++n)
uris[n] = lp->data;
@@ -420,7 +437,7 @@ tumbler_lifo_scheduler_thread (gpointer data,
/* We immediately forward error and ready so that clients rapidly know
* when individual thumbnails are ready. It's a LIFO for better inter-
- * activity with the clients, so we assume this behaviour to be wanted. */
+ * activity with the clients, so we assume this behaviour to be desired. */
/* connect to the error signal of the thumbnailer */
g_signal_connect (request->thumbnailers[n], "error",
diff --git a/tumblerd/tumbler-lifo-scheduler.h b/tumblerd/tumbler-lifo-scheduler.h
index 1cbd84d..8375c51 100644
--- a/tumblerd/tumbler-lifo-scheduler.h
+++ b/tumblerd/tumbler-lifo-scheduler.h
@@ -1,6 +1,8 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2009 Jannis Pohlmann <jannis at xfce.org>
+ * Copyright (c) 2009 Nokia,
+ * written by Philip Van Hoof <philip at codeminded.be>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
More information about the Xfce4-commits
mailing list