[gegl] buffer: fix race in gegl_tile_lock spotted by Micheal Henning
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] buffer: fix race in gegl_tile_lock spotted by Micheal Henning
- Date: Tue, 24 Jun 2014 01:44:55 +0000 (UTC)
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]