[gimp] app: make GimpTileHandlerValidate thread safe



commit 4bd118ec8ad857c8bab54ff9118937dd24d0a8e9
Author: Ell <ell_se yahoo com>
Date:   Wed Nov 15 11:49:01 2017 -0500

    app: make GimpTileHandlerValidate thread safe
    
    Use a mutex to protect the call to
    gimp_tile_handler_validate_validate() while fetching tiles, since
    it's nowhere near thread safe.

 app/gegl/gimptilehandlervalidate.c |   10 +++++++++-
 app/gegl/gimptilehandlervalidate.h |    1 +
 2 files changed, 10 insertions(+), 1 deletions(-)
---
diff --git a/app/gegl/gimptilehandlervalidate.c b/app/gegl/gimptilehandlervalidate.c
index c7feab1..71b91a7 100644
--- a/app/gegl/gimptilehandlervalidate.c
+++ b/app/gegl/gimptilehandlervalidate.c
@@ -106,6 +106,7 @@ gimp_tile_handler_validate_init (GimpTileHandlerValidate *validate)
 
   source->command = gimp_tile_handler_validate_command;
 
+  g_mutex_init (&validate->mutex);
   validate->dirty_region = cairo_region_create ();
 }
 
@@ -116,6 +117,7 @@ gimp_tile_handler_validate_finalize (GObject *object)
 
   g_clear_object (&validate->graph);
   g_clear_pointer (&validate->dirty_region, cairo_region_destroy);
+  g_mutex_clear (&validate->mutex);
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
@@ -321,7 +323,13 @@ gimp_tile_handler_validate_command (GeglTileSource  *source,
   retval = gegl_tile_handler_source_command (source, command, x, y, z, data);
 
   if (command == GEGL_TILE_GET && z == 0)
-    retval = gimp_tile_handler_validate_validate (source, retval, x, y);
+    {
+      g_mutex_lock (&validate->mutex);
+
+      retval = gimp_tile_handler_validate_validate (source, retval, x, y);
+
+      g_mutex_unlock (&validate->mutex);
+    }
 
   return retval;
 }
diff --git a/app/gegl/gimptilehandlervalidate.h b/app/gegl/gimptilehandlervalidate.h
index 5e2bda8..542deed 100644
--- a/app/gegl/gimptilehandlervalidate.h
+++ b/app/gegl/gimptilehandlervalidate.h
@@ -42,6 +42,7 @@ struct _GimpTileHandlerValidate
 {
   GeglTileHandler  parent_instance;
 
+  GMutex           mutex;
   GeglNode        *graph;
   cairo_region_t  *dirty_region;
   const Babl      *format;


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