[gegl/threaded-base-classes: 4/13] buffer: hold tile cow mutex only when updating linked list
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl/threaded-base-classes: 4/13] buffer: hold tile cow mutex only when updating linked list
- Date: Thu, 26 Jun 2014 22:09:16 +0000 (UTC)
commit abea6c37c67c0c4a484610f443d9c754a0bce915
Author: Øyvind Kolås <pippin gimp org>
Date: Tue Jun 24 06:46:23 2014 +0200
buffer: hold tile cow mutex only when updating linked list
gegl/buffer/gegl-tile.c | 19 ++++++++++++-------
1 files changed, 12 insertions(+), 7 deletions(-)
---
diff --git a/gegl/buffer/gegl-tile.c b/gegl/buffer/gegl-tile.c
index 12a3e22..dfab126 100644
--- a/gegl/buffer/gegl-tile.c
+++ b/gegl/buffer/gegl-tile.c
@@ -64,6 +64,7 @@ void gegl_tile_unref (GeglTile *tile)
g_mutex_lock (&cowmutex);
if (tile->next_shared == tile)
{ /* no clones */
+ g_mutex_unlock (&cowmutex);
if (tile->destroy_notify)
{
if (tile->destroy_notify == (void*)&free_data_directly)
@@ -77,8 +78,8 @@ void gegl_tile_unref (GeglTile *tile)
{
tile->prev_shared->next_shared = tile->next_shared;
tile->next_shared->prev_shared = tile->prev_shared;
+ g_mutex_unlock (&cowmutex);
}
- g_mutex_unlock (&cowmutex);
}
g_slice_free (GeglTile, tile);
@@ -156,10 +157,15 @@ gegl_tile_unclone (GeglTile *tile)
g_mutex_lock (&cowmutex);
if (tile->next_shared != tile)
{
+ tile->prev_shared->next_shared = tile->next_shared;
+ tile->next_shared->prev_shared = tile->prev_shared;
+ tile->prev_shared = tile;
+ tile->next_shared = tile;
+ g_mutex_unlock (&cowmutex);
+
/* the tile data is shared with other tiles,
* create a local copy
*/
-
if (tile->is_zero_tile)
{
tile->data = gegl_calloc (tile->size, 1);
@@ -171,12 +177,11 @@ gegl_tile_unclone (GeglTile *tile)
}
tile->destroy_notify = (void*)&free_data_directly;
tile->destroy_notify_data = NULL;
- tile->prev_shared->next_shared = tile->next_shared;
- tile->next_shared->prev_shared = tile->prev_shared;
- tile->prev_shared = tile;
- tile->next_shared = tile;
}
- g_mutex_unlock (&cowmutex);
+ else
+ {
+ g_mutex_unlock (&cowmutex);
+ }
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]