[gegl] buffer: cache the backend of each buffer
- From: Ãyvind KolÃs <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] buffer: cache the backend of each buffer
- Date: Thu, 3 May 2012 21:36:44 +0000 (UTC)
commit ba9e3a145d826e628616138f349497741042718a
Author: Ãyvind KolÃs <pippin gimp org>
Date: Thu May 3 22:33:25 2012 +0200
buffer: cache the backend of each buffer
For a given buffer, the backend will never change - thus we can cache the
result and avoid walking the source list as well as avoid many type checks.
gegl/buffer/gegl-buffer-private.h | 1 +
gegl/buffer/gegl-buffer.c | 27 ++++++++++++++++++++-------
gegl/buffer/gegl-tile-storage.c | 4 ++--
3 files changed, 23 insertions(+), 9 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-private.h b/gegl/buffer/gegl-buffer-private.h
index bc6f792..7886a8a 100644
--- a/gegl/buffer/gegl-buffer-private.h
+++ b/gegl/buffer/gegl-buffer-private.h
@@ -95,6 +95,7 @@ void gegl_tile_cache_init (void);
void gegl_tile_cache_destroy (void);
GeglTileBackend * gegl_buffer_backend (GeglBuffer *buffer);
+GeglTileBackend * gegl_buffer_backend2 (GeglBuffer *buffer); /* non-cached */
gboolean gegl_buffer_is_shared (GeglBuffer *buffer);
diff --git a/gegl/buffer/gegl-buffer.c b/gegl/buffer/gegl-buffer.c
index 534607c..10b0c9e 100644
--- a/gegl/buffer/gegl-buffer.c
+++ b/gegl/buffer/gegl-buffer.c
@@ -444,8 +444,9 @@ gegl_buffer_finalize (GObject *object)
G_OBJECT_CLASS (parent_class)->finalize (object);
}
+
GeglTileBackend *
-gegl_buffer_backend (GeglBuffer *buffer)
+gegl_buffer_backend2 (GeglBuffer *buffer)
{
GeglTileSource *tmp = GEGL_TILE_SOURCE (buffer);
@@ -456,7 +457,6 @@ gegl_buffer_backend (GeglBuffer *buffer)
{
tmp = GEGL_TILE_HANDLER (tmp)->source;
} while (tmp &&
- /*GEGL_IS_TILE_TRAIT (tmp) &&*/
!GEGL_IS_TILE_BACKEND (tmp));
if (!tmp &&
!GEGL_IS_TILE_BACKEND (tmp))
@@ -465,15 +465,28 @@ gegl_buffer_backend (GeglBuffer *buffer)
return (GeglTileBackend *) tmp;
}
+GeglTileBackend *
+gegl_buffer_backend (GeglBuffer *buffer)
+{
+ GeglTileBackend *tmp;
+ if (G_LIKELY (buffer->backend))
+ return buffer->backend;
+
+ tmp = gegl_buffer_backend2 (buffer);
+
+ if (tmp)
+ buffer->backend = tmp;
+
+ return (GeglTileBackend *) tmp;
+}
+
static GeglTileStorage *
gegl_buffer_tile_storage (GeglBuffer *buffer)
{
- GeglTileSource *tmp = GEGL_TILE_SOURCE (buffer);
+ GeglTileSource *tmp = (GeglTileSource*) (buffer);
- do
- {
- tmp = ((GeglTileHandler *) (tmp))->source;
- } while (!GEGL_IS_TILE_STORAGE (tmp));
+ do tmp = ((GeglTileHandler *) (tmp))->source;
+ while (!GEGL_IS_TILE_STORAGE (tmp));
g_assert (tmp);
diff --git a/gegl/buffer/gegl-tile-storage.c b/gegl/buffer/gegl-tile-storage.c
index 9393962..88e9032 100644
--- a/gegl/buffer/gegl-tile-storage.c
+++ b/gegl/buffer/gegl-tile-storage.c
@@ -133,8 +133,8 @@ gegl_tile_storage_new (GeglTileBackend *backend)
cache->tile_storage = tile_storage;
gegl_tile_handler_chain_bind (tile_handler_chain);
- ((GeglTileBackend *)gegl_buffer_backend ((void*)tile_storage))->priv->storage = (gpointer)
- tile_storage;
+ ((GeglTileBackend *)gegl_buffer_backend2 ((void*)tile_storage))->priv->storage = (gpointer)
+ tile_storage;
tile_storage->idle_swapper = g_timeout_add_full (G_PRIORITY_LOW,
250,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]