[gegl] buffer: finer grained locking for set/get_pixel
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] buffer: finer grained locking for set/get_pixel
- Date: Thu, 11 Jan 2018 23:01:42 +0000 (UTC)
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]