[gegl] buffer: finer grained locking for set/get_pixel



commit 6956b23f328c52a1a3be3468f17ed3ae9ae90a76
Author: Øyvind Kolås <pippin gimp org>
Date:   Thu Jan 11 02:40:08 2018 +0100

    buffer: finer grained locking for set/get_pixel

 gegl/buffer/gegl-buffer-access.c |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-access.c b/gegl/buffer/gegl-buffer-access.c
index 9c9e675..7a9b494 100644
--- a/gegl/buffer/gegl-buffer-access.c
+++ b/gegl/buffer/gegl-buffer-access.c
@@ -116,8 +116,6 @@ gegl_buffer_get_pixel (GeglBuffer     *buffer,
       }
     }
 
-  if (gegl_config_threads()>1)
-    g_rec_mutex_lock (&buffer->tile_storage->mutex);
 
   {
     gint tile_width  = buffer->tile_width;
@@ -134,13 +132,20 @@ gegl_buffer_get_pixel (GeglBuffer     *buffer,
           tile->x == indice_x &&
           tile->y == indice_y))
       {
+        if (gegl_config_threads()>1)
+         g_rec_mutex_lock (&buffer->tile_storage->mutex);
+
         _gegl_buffer_drop_hot_tile (buffer);
         tile = gegl_tile_source_get_tile ((GeglTileSource *) (buffer),
                                           indice_x, indice_y,
                                           0);
         buffer->tile_storage->hot_tile = tile;
+
+        if (gegl_config_threads()>1)
+          g_rec_mutex_unlock (&buffer->tile_storage->mutex);
       }
 
+
     if (tile)
       {
         gint tile_origin_x = indice_x * tile_width;
@@ -165,8 +170,6 @@ gegl_buffer_get_pixel (GeglBuffer     *buffer,
       }
   }
 
-  if (gegl_config_threads()>1)
-    g_rec_mutex_unlock (&buffer->tile_storage->mutex);
 }
 
 static inline void
@@ -185,8 +188,6 @@ __gegl_buffer_set_pixel (GeglBuffer     *buffer,
       x >= abyss->x + abyss->width)
     return;
 
-  if (gegl_config_threads()>1)
-    g_rec_mutex_lock (&buffer->tile_storage->mutex);
 
   {
     gint tile_width  = buffer->tile_width;
@@ -214,11 +215,17 @@ __gegl_buffer_set_pixel (GeglBuffer     *buffer,
           tile->x == indice_x &&
           tile->y == indice_y))
       {
+        if (gegl_config_threads()>1)
+          g_rec_mutex_lock (&buffer->tile_storage->mutex);
+
         _gegl_buffer_drop_hot_tile (buffer);
         tile = gegl_tile_source_get_tile ((GeglTileSource *) (buffer),
                                           indice_x, indice_y,
                                           0);
         buffer->tile_storage->hot_tile = tile;
+
+        if (gegl_config_threads()>1)
+          g_rec_mutex_unlock (&buffer->tile_storage->mutex);
       }
 
     if (tile)
@@ -241,8 +248,6 @@ __gegl_buffer_set_pixel (GeglBuffer     *buffer,
       }
   }
 
-  if (gegl_config_threads()>1)
-    g_rec_mutex_unlock (&buffer->tile_storage->mutex);
 }
 
 enum _GeglBufferSetFlag {


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