[gegl/threaded-base-classes] buffer: hold tile cow mutex only when updating linked list



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]