[gimp/cage: 117/130] app: serialize signals from gimpoperationtilesink



commit 5afc88c05f9d88f517fab01011087672caa8871a
Author: �yvind Kolås <pippin gimp org>
Date:   Fri Dec 17 03:20:01 2010 +0000

    app: serialize signals from gimpoperationtilesink
    
    These signals fire from threads while the mainloop is blocked by GEGL, since
    the callbacks of the signals expect exclusive access a mutex works for
    serializing.

 app/gegl/gimpoperationtilesink.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)
---
diff --git a/app/gegl/gimpoperationtilesink.c b/app/gegl/gimpoperationtilesink.c
index f8f6395..7ea21fc 100644
--- a/app/gegl/gimpoperationtilesink.c
+++ b/app/gegl/gimpoperationtilesink.c
@@ -187,12 +187,14 @@ gimp_operation_tile_sink_set_property (GObject      *object,
     }
 }
 
+
 static gboolean
 gimp_operation_tile_sink_process (GeglOperation       *operation,
                                   GeglBuffer          *input,
                                   const GeglRectangle *result)
 {
   GimpOperationTileSink *self = GIMP_OPERATION_TILE_SINK (operation);
+  static GStaticMutex    mutex = G_STATIC_MUTEX_INIT;
   const Babl            *format;
   PixelRegion            destPR;
   gpointer               pr;
@@ -218,7 +220,13 @@ gimp_operation_tile_sink_process (GeglOperation       *operation,
                        1.0, &rect, format, destPR.data, destPR.rowstride);
     }
 
+  g_static_mutex_lock (&mutex); 
+  /* a lock here serializes all fired signals, this emit gets called from
+   * different worker threads, but the main loop will be blocked by GEGL
+   * when it happens
+   */
   g_signal_emit (operation, tile_sink_signals[DATA_WRITTEN], 0, result);
+  g_static_mutex_unlock (&mutex);
 
   return TRUE;
 }



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