[gegl/gsoc2009-gpu: 10/15] Update all tile reads to lock and unlock the tile before and after access, respectively
- From: Martin Nordholts <martinn src gnome org>
- To: svn-commits-list gnome org
- Subject: [gegl/gsoc2009-gpu: 10/15] Update all tile reads to lock and unlock the tile before and after access, respectively
- Date: Wed, 24 Jun 2009 05:38:49 +0000 (UTC)
commit f9f6631e3bb3fbd8a94d9ab16ca2acbd334526ad
Author: Jerson Michael Perpetua <jersonperpetua gmail com>
Date: Wed Jun 17 21:01:55 2009 +0800
Update all tile reads to lock and unlock the tile before and after access, respectively
gegl/buffer/gegl-buffer-access.c | 16 ++++++++++++----
gegl/buffer/gegl-buffer-iterator.c | 26 ++++++++++++++++++--------
gegl/buffer/gegl-buffer-linear.c | 2 +-
gegl/buffer/gegl-buffer-save.c | 3 +++
gegl/buffer/gegl-tile-backend-ram.c | 2 ++
gegl/buffer/gegl-tile-backend-tiledir.c | 2 ++
gegl/buffer/gegl-tile-handler-zoom.c | 2 ++
7 files changed, 40 insertions(+), 13 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-access.c b/gegl/buffer/gegl-buffer-access.c
index b14a49f..99feeff 100644
--- a/gegl/buffer/gegl-buffer-access.c
+++ b/gegl/buffer/gegl-buffer-access.c
@@ -341,13 +341,20 @@ gegl_buffer_get_pixel (GeglBuffer *buffer,
{
gint offsetx = gegl_tile_offset (tiledx, tile_width);
gint offsety = gegl_tile_offset (tiledy, tile_height);
- guchar *tp = gegl_tile_get_data (tile) +
- (offsety * tile_width + offsetx) * px_size;
+ guchar *tp;
+
+ gegl_tile_lock (tile, GEGL_TILE_LOCK_READ);
+
+ tp = gegl_tile_get_data (tile)
+ + (offsety * tile_width + offsetx) * px_size;
+
if (fish)
babl_process (fish, tp, buf, 1);
else
memcpy (buf, tp, px_size);
+ gegl_tile_unlock (tile);
+
/*g_object_unref (tile);*/
buffer->hot_tile = tile;
}
@@ -617,6 +624,8 @@ gegl_buffer_iterate (GeglBuffer *buffer,
if (write)
gegl_tile_lock (tile, GEGL_TILE_LOCK_WRITE);
+ else
+ gegl_tile_lock (tile, GEGL_TILE_LOCK_READ);
tile_base = gegl_tile_get_data (tile);
tp = ((guchar *) tile_base) + (offsety * tile_width + offsetx) * px_size;
@@ -666,8 +675,6 @@ gegl_buffer_iterate (GeglBuffer *buffer,
bp += buf_stride;
}
}
-
- gegl_tile_unlock (tile);
}
else /* read */
{
@@ -707,6 +714,7 @@ gegl_buffer_iterate (GeglBuffer *buffer,
bp += buf_stride;
}
}
+ gegl_tile_unlock (tile);
g_object_unref (tile);
}
bufx += (tile_width - offsetx);
diff --git a/gegl/buffer/gegl-buffer-iterator.c b/gegl/buffer/gegl-buffer-iterator.c
index ca7c712..84aa886 100644
--- a/gegl/buffer/gegl-buffer-iterator.c
+++ b/gegl/buffer/gegl-buffer-iterator.c
@@ -153,10 +153,14 @@ gulp:
/* unref previously held tile */
if (i->tile)
{
- if (i->write && i->subrect.width == tile_width)
- {
- gegl_tile_unlock (i->tile);
- }
+ /* XXX: do we still need to handle the first condition below?
+ *
+ * if (i->write && i->subrect.width == tile_width)
+ * {
+ * gegl_tile_unlock (i->tile);
+ * }
+ */
+ gegl_tile_unlock (i->tile);
g_object_unref (i->tile);
i->tile = NULL;
}
@@ -185,10 +189,16 @@ gulp:
gegl_tile_index (tiledx, tile_width),
gegl_tile_index (tiledy, tile_height),
0);
- if (i->write && tile_width==i->subrect.width)
- {
- gegl_tile_lock (i->tile, GEGL_TILE_LOCK_WRITE);
- }
+
+ /* XXX: do we still need to handle the second condition below?
+ *
+ * if (i->write && tile_width==i->subrect.width)
+ */
+ if (i->write)
+ gegl_tile_lock (i->tile, GEGL_TILE_LOCK_WRITE);
+ else
+ gegl_tile_lock (i->tile, GEGL_TILE_LOCK_READ);
+
i->data = gegl_tile_get_data (i->tile);
{
diff --git a/gegl/buffer/gegl-buffer-linear.c b/gegl/buffer/gegl-buffer-linear.c
index 30c2089..009979b 100644
--- a/gegl/buffer/gegl-buffer-linear.c
+++ b/gegl/buffer/gegl-buffer-linear.c
@@ -152,7 +152,7 @@ gegl_buffer_linear_open (GeglBuffer *buffer,
0,0,0);
g_assert (tile);
gegl_buffer_lock (buffer);
- gegl_tile_lock (tile, GEGL_TILE_LOCK_WRITE);
+ gegl_tile_lock (tile, GEGL_TILE_LOCK_READWRITE);
g_object_set_data (G_OBJECT (buffer), "linear-tile", tile);
diff --git a/gegl/buffer/gegl-buffer-save.c b/gegl/buffer/gegl-buffer-save.c
index 5a8f7e7..f787516 100644
--- a/gegl/buffer/gegl-buffer-save.c
+++ b/gegl/buffer/gegl-buffer-save.c
@@ -382,6 +382,8 @@ gegl_buffer_save (GeglBuffer *buffer,
entry->y,
entry->z);
g_assert (tile);
+ gegl_tile_lock (tile, GEGL_TILE_LOCK_READ);
+
data = gegl_tile_get_data (tile);
g_assert (data);
@@ -395,6 +397,7 @@ gegl_buffer_save (GeglBuffer *buffer,
info->offset += ret;
}
#endif
+ gegl_tile_unlock (tile);
g_object_unref (G_OBJECT (tile));
i++;
}
diff --git a/gegl/buffer/gegl-tile-backend-ram.c b/gegl/buffer/gegl-tile-backend-ram.c
index 3a6a28f..02e27a9 100644
--- a/gegl/buffer/gegl-tile-backend-ram.c
+++ b/gegl/buffer/gegl-tile-backend-ram.c
@@ -187,7 +187,9 @@ gboolean set_tile (GeglTileSource *store,
entry->z = z;
g_hash_table_insert (tile_backend_ram->entries, entry, entry);
}
+ gegl_tile_lock (tile, GEGL_TILE_LOCK_READ);
ram_entry_write (tile_backend_ram, entry, tile->data);
+ gegl_tile_unlock (tile);
tile->stored_rev = tile->rev;
return TRUE;
}
diff --git a/gegl/buffer/gegl-tile-backend-tiledir.c b/gegl/buffer/gegl-tile-backend-tiledir.c
index be45ac2..3f53f38 100644
--- a/gegl/buffer/gegl-tile-backend-tiledir.c
+++ b/gegl/buffer/gegl-tile-backend-tiledir.c
@@ -180,7 +180,9 @@ set_tile (GeglTileSource *store,
entry.y = y;
entry.z = z;
+ gegl_tile_lock (tile, GEGL_TILE_LOCK_READ);
gio_entry_write (tile_backend_tiledir, &entry, tile->data);
+ gegl_tile_unlock (tile);
tile->stored_rev = tile->rev;
return NULL;
}
diff --git a/gegl/buffer/gegl-tile-handler-zoom.c b/gegl/buffer/gegl-tile-handler-zoom.c
index e16b144..4270b5b 100644
--- a/gegl/buffer/gegl-tile-handler-zoom.c
+++ b/gegl/buffer/gegl-tile-handler-zoom.c
@@ -287,7 +287,9 @@ get_tile (GeglTileSource *gegl_tile_source,
{
if (source_tile[i][j])
{
+ gegl_tile_lock (source_tile[i][j], GEGL_TILE_LOCK_READ);
set_half (tile, source_tile[i][j], tile_width, tile_height, format, i, j);
+ gegl_tile_unlock (source_tile[i][j]);
g_object_unref (source_tile[i][j]);
}
else
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]