[gnome-photos/wip/rishi/task-cache: 4/11] base-item: Add a cache to batch together pipeline loading operations
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-photos/wip/rishi/task-cache: 4/11] base-item: Add a cache to batch together pipeline loading operations
- Date: Tue, 7 Mar 2017 12:26:58 +0000 (UTC)
commit 8573bb18089318f3f7dc2cb042ef3a93a5666f45
Author: Debarshi Ray <debarshir gnome org>
Date: Mon Feb 27 01:06:57 2017 +0100
base-item: Add a cache to batch together pipeline loading operations
src/photos-base-item.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 73 insertions(+), 0 deletions(-)
---
diff --git a/src/photos-base-item.c b/src/photos-base-item.c
index 713fdd4..c4f1503 100644
--- a/src/photos-base-item.c
+++ b/src/photos-base-item.c
@@ -40,6 +40,7 @@
#include <tracker-sparql.h>
#include "egg-counter.h"
+#include "egg-task-cache.h"
#include "photos-application.h"
#include "photos-base-item.h"
#include "photos-collection-icon-watcher.h"
@@ -177,6 +178,7 @@ struct _PhotosBaseItemSaveToStreamData
gdouble zoom;
};
+static EggTaskCache *pipeline_cache;
static GdkPixbuf *failed_icon;
static GdkPixbuf *thumbnailing_icon;
static GThreadPool *create_thumbnail_pool;
@@ -425,6 +427,7 @@ photos_base_item_clear_pixels (PhotosBaseItem *self)
priv = photos_base_item_get_instance_private (self);
priv->buffer_source = NULL;
+ egg_task_cache_evict (pipeline_cache, self);
g_clear_object (&priv->edit_graph);
g_clear_object (&priv->pipeline);
@@ -1459,6 +1462,64 @@ photos_base_item_load_buffer_finish (PhotosBaseItem *self, GAsyncResult *res, GE
static void
+photos_base_item_load_pipeline_task_cache_populate_new (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GError *error;
+ GTask *task = G_TASK (user_data);
+ PhotosPipeline *pipeline = NULL;
+
+ error = NULL;
+ pipeline = photos_pipeline_new_finish (res, &error);
+ if (error != NULL)
+ {
+ g_task_return_error (task, error);
+ goto out;
+ }
+
+ g_task_return_pointer (task, g_object_ref (pipeline), g_object_unref);
+
+ out:
+ g_clear_object (&pipeline);
+ g_object_unref (task);
+}
+
+
+static void
+photos_base_item_load_pipeline_task_cache_populate (EggTaskCache *cache,
+ gconstpointer key,
+ GTask *task,
+ gpointer user_data)
+{
+ PhotosBaseItem *self = PHOTOS_BASE_ITEM ((gpointer) key);
+ PhotosBaseItemClass *class;
+ GCancellable *cancellable;
+ gchar *uri = NULL;
+
+ cancellable = g_task_get_cancellable (task);
+
+ class = PHOTOS_BASE_ITEM_GET_CLASS (self);
+ if (class->create_pipeline_path != NULL)
+ {
+ gchar *path;
+
+ path = class->create_pipeline_path (self);
+ uri = photos_utils_convert_path_to_uri (path);
+ g_free (path);
+ }
+
+ photos_pipeline_new_async (NULL,
+ uri,
+ cancellable,
+ photos_base_item_load_pipeline_task_cache_populate_new,
+ g_object_ref (task));
+
+ g_free (uri);
+}
+
+
+static void
photos_base_item_load_process (GObject *source_object, GAsyncResult *res, gpointer user_data)
{
GTask *task = G_TASK (user_data);
@@ -2696,6 +2757,18 @@ photos_base_item_class_init (PhotosBaseItemClass *class)
g_object_class_override_property (object_class, PROP_SECONDARY_TEXT, "secondary-text");
g_object_class_override_property (object_class, PROP_URI, "uri");
+ pipeline_cache = egg_task_cache_new (g_direct_hash,
+ g_direct_equal,
+ NULL,
+ NULL,
+ g_object_ref,
+ g_object_unref,
+ 0,
+ photos_base_item_load_pipeline_task_cache_populate,
+ NULL,
+ NULL);
+ egg_task_cache_set_name (pipeline_cache, "PhotosPipeline cache");
+
create_thumbnail_pool = g_thread_pool_new (photos_base_item_create_thumbnail_in_thread_func,
NULL,
1,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]