[gegl] Add flush-on-destroy property to TileBackend



commit 5642616f183aee312b788728265959b4f382e67f
Author: Daniel Sabo <DanielSabo gmail com>
Date:   Fri Jan 24 14:26:09 2014 -0800

    Add flush-on-destroy property to TileBackend
    
    Use a boolean to control whether or not data gets flushed when a
    buffer is destroyed instead of sniffing the object type.

 gegl/buffer/gegl-buffer-types.h            |    2 +
 gegl/buffer/gegl-buffer.c                  |    6 +----
 gegl/buffer/gegl-tile-backend-file-async.c |    2 +
 gegl/buffer/gegl-tile-backend-ram.c        |    2 +
 gegl/buffer/gegl-tile-backend-swap.c       |    2 +
 gegl/buffer/gegl-tile-backend-tiledir.c    |    3 ++
 gegl/buffer/gegl-tile-backend.c            |   30 +++++++++++++++++++++++++++-
 gegl/buffer/gegl-tile-backend.h            |   13 ++++++++++++
 8 files changed, 54 insertions(+), 6 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-types.h b/gegl/buffer/gegl-buffer-types.h
index 4289eed..daeb623 100644
--- a/gegl/buffer/gegl-buffer-types.h
+++ b/gegl/buffer/gegl-buffer-types.h
@@ -36,6 +36,8 @@ struct _GeglTileBackendPrivate
   gint        px_size;   /* size of a single pixel in bytes */
   gint        tile_size; /* size of an entire tile in bytes */
 
+  gboolean    flush_on_destroy;
+
   GeglRectangle extent;
 
   gpointer    header;
diff --git a/gegl/buffer/gegl-buffer.c b/gegl/buffer/gegl-buffer.c
index 26a07e9..ebe475d 100644
--- a/gegl/buffer/gegl-buffer.c
+++ b/gegl/buffer/gegl-buffer.c
@@ -413,11 +413,7 @@ gegl_buffer_dispose (GObject *object)
     {
       GeglTileBackend *backend = gegl_buffer_backend (buffer);
 
-      /* only flush non-internal backends,. */
-      if (!(GEGL_IS_TILE_BACKEND_FILE (backend) ||
-            GEGL_IS_TILE_BACKEND_RAM (backend) ||
-            GEGL_IS_TILE_BACKEND_TILE_DIR (backend) ||
-            GEGL_IS_TILE_BACKEND_SWAP (backend)))
+      if (gegl_tile_backend_get_flush_on_destroy (backend))
         gegl_buffer_flush (buffer);
 
       gegl_tile_source_reinit (GEGL_TILE_SOURCE (handler->source));
diff --git a/gegl/buffer/gegl-tile-backend-file-async.c b/gegl/buffer/gegl-tile-backend-file-async.c
index 92ed5de..9898954 100644
--- a/gegl/buffer/gegl-tile-backend-file-async.c
+++ b/gegl/buffer/gegl-tile-backend-file-async.c
@@ -1212,6 +1212,8 @@ gegl_tile_backend_file_constructor (GType                  type,
 
   backend->priv->header = &self->header;
 
+  gegl_tile_backend_set_flush_on_destroy (backend, FALSE);
+
   return object;
 }
 
diff --git a/gegl/buffer/gegl-tile-backend-ram.c b/gegl/buffer/gegl-tile-backend-ram.c
index 4c18fc7..bc6807e 100644
--- a/gegl/buffer/gegl-tile-backend-ram.c
+++ b/gegl/buffer/gegl-tile-backend-ram.c
@@ -345,6 +345,8 @@ gegl_tile_backend_ram_constructor (GType                  type,
                                         NULL,
                                         ram_entry_free_func);
 
+  gegl_tile_backend_set_flush_on_destroy (GEGL_TILE_BACKEND (object), FALSE);
+
   return object;
 }
 
diff --git a/gegl/buffer/gegl-tile-backend-swap.c b/gegl/buffer/gegl-tile-backend-swap.c
index 3f3b644..1ada1e7 100644
--- a/gegl/buffer/gegl-tile-backend-swap.c
+++ b/gegl/buffer/gegl-tile-backend-swap.c
@@ -796,6 +796,8 @@ gegl_tile_backend_swap_constructor (GType                  type,
 
   backend->priv->shared = FALSE;
 
+  gegl_tile_backend_set_flush_on_destroy (backend, FALSE);
+
   GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "constructing swap backend");
 
   return object;
diff --git a/gegl/buffer/gegl-tile-backend-tiledir.c b/gegl/buffer/gegl-tile-backend-tiledir.c
index 2e2c87a..bdcb25d 100644
--- a/gegl/buffer/gegl-tile-backend-tiledir.c
+++ b/gegl/buffer/gegl-tile-backend-tiledir.c
@@ -356,6 +356,9 @@ gegl_tile_backend_tiledir_constructor (GType                  type,
   gio->buffer_dir = g_file_new_for_commandline_arg (gio->path);
   g_file_make_directory (gio->buffer_dir, NULL, NULL);
   ((GeglTileSource*)(object))->command = gegl_tile_backend_tiledir_command;
+
+  gegl_tile_backend_set_flush_on_destroy (GEGL_TILE_BACKEND (object), FALSE);
+
   return object;
 }
 
diff --git a/gegl/buffer/gegl-tile-backend.c b/gegl/buffer/gegl-tile-backend.c
index 424c79f..f14e06d 100644
--- a/gegl/buffer/gegl-tile-backend.c
+++ b/gegl/buffer/gegl-tile-backend.c
@@ -39,7 +39,8 @@ enum
   PROP_TILE_HEIGHT,
   PROP_PX_SIZE,
   PROP_TILE_SIZE,
-  PROP_FORMAT
+  PROP_FORMAT,
+  PROP_FLUSH_ON_DESTROY
 };
 
 static void
@@ -72,6 +73,10 @@ get_property (GObject    *gobject,
         g_value_set_pointer (value, (void*)backend->priv->format);
         break;
 
+      case PROP_FLUSH_ON_DESTROY:
+        g_value_set_boolean (value, backend->priv->flush_on_destroy);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, pspec);
         break;
@@ -100,6 +105,10 @@ set_property (GObject      *gobject,
         backend->priv->format = g_value_get_pointer (value);
         break;
 
+      case PROP_FLUSH_ON_DESTROY:
+        backend->priv->flush_on_destroy = g_value_get_boolean (value);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, pspec);
         break;
@@ -162,6 +171,12 @@ gegl_tile_backend_class_init (GeglTileBackendClass *klass)
                                                          "babl format",
                                                          G_PARAM_READWRITE |
                                                          G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property (gobject_class, PROP_FLUSH_ON_DESTROY,
+                                   g_param_spec_boolean ("flush-on-destroy", "flush-on-destroy",
+                                                         "Cache tiles will be flushed before the backend is 
destroyed",
+                                                         TRUE,
+                                                         G_PARAM_READWRITE |
+                                                         G_PARAM_CONSTRUCT));
 
   g_type_class_add_private (gobject_class, sizeof (GeglTileBackendPrivate));
 }
@@ -221,6 +236,19 @@ gegl_tile_backend_peek_storage (GeglTileBackend *backend)
 }
 
 void
+gegl_tile_backend_set_flush_on_destroy (GeglTileBackend *tile_backend,
+                                        gboolean         flush_on_destroy)
+{
+  tile_backend->priv->flush_on_destroy = flush_on_destroy;
+}
+
+gboolean
+gegl_tile_backend_get_flush_on_destroy (GeglTileBackend *tile_backend)
+{
+  return tile_backend->priv->flush_on_destroy;
+}
+
+void
 gegl_tile_backend_unlink_swap (gchar *path)
 {
   gchar *dirname = g_path_get_dirname (path);
diff --git a/gegl/buffer/gegl-tile-backend.h b/gegl/buffer/gegl-tile-backend.h
index 537e667..83db254 100644
--- a/gegl/buffer/gegl-tile-backend.h
+++ b/gegl/buffer/gegl-tile-backend.h
@@ -108,6 +108,19 @@ void  gegl_tile_backend_set_extent    (GeglTileBackend *tile_backend,
 
 GeglRectangle gegl_tile_backend_get_extent (GeglTileBackend *tile_backend);
 
+/**
+ * gegl_tile_backend_set_flush_on_destroy:
+ * @tile_backend: a #GeglTileBackend
+ * @flush_on_destroy: true if the backend needs to be flushed
+ *
+ * Control whether cached data will be written to the backend before it
+ * is destroyed. If false unwritten data will be discarded.
+ */
+void gegl_tile_backend_set_flush_on_destroy (GeglTileBackend *tile_backend,
+                                             gboolean         flush_on_destroy);
+
+gboolean gegl_tile_backend_get_flush_on_destroy (GeglTileBackend *tile_backend);
+
 GType gegl_tile_backend_get_type (void) G_GNUC_CONST;
 
 /**


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]