[gegl] buffer: fix empty tile uncloning rollback
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] buffer: fix empty tile uncloning rollback
- Date: Sun, 1 Jul 2018 11:50:46 +0000 (UTC)
commit 4161757959f656399f7be1ef505174e81e27d12c
Author: Ell <ell_se yahoo com>
Date: Sun Jul 1 06:56:41 2018 -0400
buffer: fix empty tile uncloning rollback
When uncloning an empty tile, make sure to always mark it as non-
empty, even if we end up rolling-back to the original buffer, since
it may subsequently be written to.
Also, add description for the GeglTile::is_zero_tile member.
gegl/buffer/gegl-buffer-private.h | 5 ++++-
gegl/buffer/gegl-tile.c | 3 ++-
2 files changed, 6 insertions(+), 2 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-private.h b/gegl/buffer/gegl-buffer-private.h
index e4fe3debc..f43b76ecc 100644
--- a/gegl/buffer/gegl-buffer-private.h
+++ b/gegl/buffer/gegl-buffer-private.h
@@ -158,7 +158,10 @@ struct _GeglTile
(currently set to 1 when loaded from disk */
gint lock_count; /* number of outstanding write locks */
- gint is_zero_tile:1;
+ guint is_zero_tile:1; /* whether the tile data is fully zeroed
+ * (allowing for false negatives, but not
+ * false positives)
+ */
gint clone_state; /* tile clone/unclone state & spinlock */
gint *n_clones; /* an array of two atomic counters, shared
diff --git a/gegl/buffer/gegl-tile.c b/gegl/buffer/gegl-tile.c
index eef551f13..933cbaeea 100644
--- a/gegl/buffer/gegl-tile.c
+++ b/gegl/buffer/gegl-tile.c
@@ -196,6 +196,8 @@ gegl_tile_unclone (GeglTile *tile)
*/
if (tile->is_zero_tile)
{
+ tile->is_zero_tile = FALSE;
+
if (g_atomic_int_dec_and_test (gegl_tile_n_clones (tile)))
{
/* someone else uncloned the tile in the meantime, and we're now
@@ -210,7 +212,6 @@ gegl_tile_unclone (GeglTile *tile)
tile->n_clones = gegl_calloc (INLINE_N_ELEMENTS_DATA_OFFSET +
tile->size, 1);
- tile->is_zero_tile = 0;
}
else
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]