[gimp/soc-2010-cage-2] app: serialize signals from gimpoperationtilesink
- From: Michael Muré <mmure src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/soc-2010-cage-2] app: serialize signals from gimpoperationtilesink
- Date: Thu, 30 Dec 2010 18:15:12 +0000 (UTC)
commit 93614bf633c4620eb3cc17b0676577c64a61c412
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]