[gegl] Add flush-on-destroy property to TileBackend
- From: Daniel Sabo <daniels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] Add flush-on-destroy property to TileBackend
- Date: Wed, 29 Jan 2014 06:38:39 +0000 (UTC)
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]