[gegl/gsoc2009-gpu: 10/15] Update all tile reads to lock and unlock the tile before and after access, respectively



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]