[gegl] buffer: add a lock around cow dup/dedup



commit bd4b91657287bfa646a382e64b3bbd0f6555d312
Author: Ãyvind KolÃs <pippin gimp org>
Date:   Sat Mar 31 18:11:35 2012 +0100

    buffer: add a lock around cow dup/dedup

 gegl/buffer/gegl-tile.c        |   13 +++++++++++++
 operations/common/dropshadow.c |    2 +-
 2 files changed, 14 insertions(+), 1 deletions(-)
---
diff --git a/gegl/buffer/gegl-tile.c b/gegl/buffer/gegl-tile.c
index 655923a..d89d893 100644
--- a/gegl/buffer/gegl-tile.c
+++ b/gegl/buffer/gegl-tile.c
@@ -39,6 +39,7 @@
 
 #include "gegl-utils.h"
 
+static GStaticMutex cowmutex = G_STATIC_MUTEX_INIT;
 
 GeglTile *gegl_tile_ref (GeglTile *tile)
 {
@@ -136,7 +137,17 @@ gegl_tile_dup (GeglTile *src)
       g_mutex_lock (tile->next_shared->mutex);
     }
 #endif
+  if (tile->next_shared != src)
+    {
+      g_static_mutex_lock (&cowmutex);
+    }
+
   tile->next_shared->prev_shared = tile;
+
+  if (tile->next_shared != src)
+    {
+      g_static_mutex_unlock (&cowmutex);
+    }
 #ifdef GEGL_USE_TILE_MUTEX
   if (tile->next_shared != src)
     {
@@ -175,6 +186,7 @@ gegl_tile_unclone (GeglTile *tile)
       /* the tile data is shared with other tiles,
        * create a local copy
        */
+      g_static_mutex_lock (&cowmutex);
       tile->data                     = gegl_memdup (tile->data, tile->size);
       tile->destroy_notify           = (void*)&free_data_directly;
       tile->destroy_notify_data      = NULL;
@@ -182,6 +194,7 @@ gegl_tile_unclone (GeglTile *tile)
       tile->next_shared->prev_shared = tile->prev_shared;
       tile->prev_shared              = tile;
       tile->next_shared              = tile;
+      g_static_mutex_unlock (&cowmutex);
     }
 }
 #if 0
diff --git a/operations/common/dropshadow.c b/operations/common/dropshadow.c
index 0f02b34..5a49dcb 100644
--- a/operations/common/dropshadow.c
+++ b/operations/common/dropshadow.c
@@ -22,7 +22,7 @@
 
 #ifdef GEGL_CHANT_PROPERTIES
 
-gegl_chant_double (opacity, _("Opacity"), -1.0, 1.0, 0.5, _("Opacity"))
+gegl_chant_double (opacity, _("Opacity"), -2.0, 2.0, 0.5, _("Opacity"))
 gegl_chant_double_ui (x, _("X"), -G_MAXDOUBLE, G_MAXDOUBLE, 20.0, -20.0, 20.0, 1.0,
                    _("Horizontal shadow offset."))
 gegl_chant_double_ui (y, _("Y"), -G_MAXDOUBLE, G_MAXDOUBLE, 20.0, -20.0, 20.0, 1.0,



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