[gthumb] preloader: start the next loader only after the current loader has been stopped
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] preloader: start the next loader only after the current loader has been stopped
- Date: Wed, 22 Aug 2012 16:00:26 +0000 (UTC)
commit dc950661e2736225531bfbb79b563a551714cd25
Author: Paolo Bacchilega <paobac src gnome org>
Date: Wed Aug 22 17:46:38 2012 +0200
preloader: start the next loader only after the current loader has been stopped
gthumb/gth-image-preloader.c | 59 ++++++++++++++++++++++++++++++++---------
1 files changed, 46 insertions(+), 13 deletions(-)
---
diff --git a/gthumb/gth-image-preloader.c b/gthumb/gth-image-preloader.c
index 08ca392..cf5532d 100644
--- a/gthumb/gth-image-preloader.c
+++ b/gthumb/gth-image-preloader.c
@@ -58,6 +58,16 @@ typedef struct {
} Preloader;
+typedef struct {
+ GthImagePreloader *self;
+ GthFileData *requested;
+ int requested_size;
+ GthFileData **files;
+ int n_files;
+ guint token;
+} LoadData;
+
+
struct _GthImagePreloaderPrivate {
GthLoadPolicy load_policy;
int n_preloaders;
@@ -80,6 +90,7 @@ struct _GthImagePreloaderPrivate {
guint load_id;
GCancellable *cancellable;
guint token;
+ LoadData *next_load_data;
};
@@ -218,6 +229,9 @@ preloader_signal_to_emit (Preloader *preloader)
/* -- GthImagePreloader -- */
+static void load_data_free (LoadData *load_data);
+
+
static void
gth_image_preloader_finalize (GObject *object)
{
@@ -234,6 +248,11 @@ gth_image_preloader_finalize (GObject *object)
self->priv->load_id = 0;
}
+ if (self->priv->next_load_data != NULL) {
+ load_data_free (self->priv->next_load_data);
+ self->priv->next_load_data = NULL;
+ }
+
for (i = 0; i < self->priv->n_preloaders; i++) {
self->priv->loader[i]->canceled = TRUE;
preloader_unref (self->priv->loader[i]);
@@ -375,6 +394,9 @@ load_request_free (LoadRequest *load_request)
}
+static void assign_loaders (LoadData *load_data);
+
+
static void
image_loader_ready_cb (GObject *source_object,
GAsyncResult *result,
@@ -412,6 +434,15 @@ image_loader_ready_cb (GObject *source_object,
if (error != NULL)
g_error_free (error);
_g_object_unref (image);
+
+ if (self->priv->next_load_data != NULL) {
+ assign_loaders (self->priv->next_load_data);
+ start_next_loader (self);
+
+ load_data_free (self->priv->next_load_data);
+ self->priv->next_load_data = NULL;
+ }
+
return;
}
@@ -427,7 +458,7 @@ image_loader_ready_cb (GObject *source_object,
if (_g_file_equal (load_request->file_data->file, self->priv->requested_file)) {
#if DEBUG_PRELOADER
- debug (DEBUG_INFO, "[requested] %s => %s [size: %d]", (error == NULL) ? "ready" : "error", g_file_get_uri (preloader->file_data->file), preloader->requested_size);
+ debug (DEBUG_INFO, "loaded [requested] %s => %s [size: %d]", (error == NULL) ? "ready" : "error", g_file_get_uri (preloader->file_data->file), preloader->requested_size);
#endif
g_signal_emit (G_OBJECT (self),
@@ -451,6 +482,10 @@ image_loader_ready_cb (GObject *source_object,
else
interval = REQUESTED_INTERVAL;
}
+#if DEBUG_PRELOADER
+ else
+ debug (DEBUG_INFO, "loaded [non-requested] %s => %s [size: %d]", (error == NULL) ? "ready" : "error", g_file_get_uri (preloader->file_data->file), preloader->requested_size);
+#endif
if (self->priv->load_id == 0)
self->priv->load_id = g_timeout_add (interval, load_next, self);
@@ -543,16 +578,6 @@ start_next_loader (GthImagePreloader *self)
}
-typedef struct {
- GthImagePreloader *self;
- GthFileData *requested;
- int requested_size;
- GthFileData **files;
- int n_files;
- guint token;
-} LoadData;
-
-
static void
load_data_free (LoadData *load_data)
{
@@ -623,7 +648,7 @@ assign_loaders (LoadData *load_data)
NULL);
#if DEBUG_PRELOADER
- debug (DEBUG_INFO, "[requested] preloaded");
+ debug (DEBUG_INFO, "[requested] preloaded %s [size: %d]", g_file_get_uri (preloader->file_data->file), preloader->requested_size);
#endif
if (preloader_needs_second_step (preloader)) {
@@ -739,6 +764,11 @@ gth_image_preloader_load (GthImagePreloader *self,
_g_object_unref (self->priv->requested_file);
self->priv->requested_file = g_file_dup (requested->file);
+ if (self->priv->next_load_data != NULL) {
+ load_data_free (self->priv->next_load_data);
+ self->priv->next_load_data = NULL;
+ }
+
load_data = g_new0 (LoadData, 1);
load_data->self = self;
load_data->token = self->priv->token;
@@ -761,8 +791,11 @@ gth_image_preloader_load (GthImagePreloader *self,
Preloader *preloader;
preloader = current_preloader (self);
- if (preloader != NULL)
+ if (preloader != NULL) {
+ self->priv->next_load_data = load_data;
g_cancellable_cancel (preloader->self->priv->cancellable);
+ return;
+ }
}
assign_loaders (load_data);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]