From 44ceeb246e4db6e59f2e0eb245e96a0d3ae9a19d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Fri, 17 Dec 2010 03:20:01 +0000 Subject: [PATCH] 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 file changed, 8 insertions(+) diff --git a/app/gegl/gimpoperationtilesink.c b/app/gegl/gimpoperationtilesink.c index f8f6395e8e..7ea21fc251 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; }