[gegl] buffer: fix race in gegl_tile_lock spotted by Micheal Henning



commit 431331ac826c61e7614638f12d3fd31fb8bda8c4
Author: Øyvind Kolås <pippin gimp org>
Date:   Tue Jun 24 01:57:56 2014 +0200

    buffer: fix race in gegl_tile_lock spotted by Micheal Henning

 gegl/buffer/gegl-buffer-private.h |    2 +-
 gegl/buffer/gegl-tile.c           |    8 +++-----
 2 files changed, 4 insertions(+), 6 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-private.h b/gegl/buffer/gegl-buffer-private.h
index 64dcdcf..9d9100e 100644
--- a/gegl/buffer/gegl-buffer-private.h
+++ b/gegl/buffer/gegl-buffer-private.h
@@ -164,7 +164,7 @@ struct _GeglTile
   guint            stored_rev;  /* what revision was we when we from tile_storage?
                                    (currently set to 1 when loaded from disk */
 
-  gchar            lock;        /* number of times the tile is write locked
+  gint             lock;        /* number of times the tile is write locked
                                  * should in theory just have the values 0/1
                                  */
   gint             is_zero_tile:1;
diff --git a/gegl/buffer/gegl-tile.c b/gegl/buffer/gegl-tile.c
index 92caa1a..12a3e22 100644
--- a/gegl/buffer/gegl-tile.c
+++ b/gegl/buffer/gegl-tile.c
@@ -183,7 +183,7 @@ void
 gegl_tile_lock (GeglTile *tile)
 {
   int slept = 0;
-  while (tile->lock != 0)
+  while (! (g_atomic_int_compare_and_exchange (&tile->lock, 0, 1)))
   {
     if (slept++ == 1000)
     {
@@ -191,7 +191,6 @@ gegl_tile_lock (GeglTile *tile)
     }
     g_usleep (5);
   }
-  tile->lock++;
 
   gegl_tile_unclone (tile);
 }
@@ -235,8 +234,7 @@ gegl_tile_unlock (GeglTile *tile)
     {
       g_warning ("unlocked a tile with lock count == 0");
     }
-
-  if (tile->lock==1)
+  else if (tile->lock==1)
   {
     if (tile->z == 0)
       {
@@ -245,7 +243,7 @@ gegl_tile_unlock (GeglTile *tile)
       tile->rev++;
   }
 
-  tile->lock--;
+  g_atomic_int_add (&tile->lock, -1);
 }
 
 void


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