[gegl] buffer: fix empty tile uncloning rollback



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]