[gimp/wip/animation: 177/197] plug-ins: better check for queue existence in the idle.
- From: Jehan Pagès <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/wip/animation: 177/197] plug-ins: better check for queue existence in the idle.
- Date: Sat, 7 Oct 2017 03:13:19 +0000 (UTC)
commit 8b05db33e29fdb256e7d6dd5a51dbdfb6bdfa3be
Author: Jehan <jehan girinstud io>
Date: Mon Jul 17 12:14:36 2017 +0200
plug-ins: better check for queue existence in the idle.
When finalizing the animation renderer, the idle may still live slightly
longer after the queue has been freed. I check first for the priv
member, because for some reason, I had segfaults sometimes when shutting
down the plugin immediately after start, though I don't see how this
could not be present at the time the idle runs; yet it was so.
plug-ins/animation-play/core/animation-renderer.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
---
diff --git a/plug-ins/animation-play/core/animation-renderer.c
b/plug-ins/animation-play/core/animation-renderer.c
index ec4955a..b6e664c 100644
--- a/plug-ins/animation-play/core/animation-renderer.c
+++ b/plug-ins/animation-play/core/animation-renderer.c
@@ -171,6 +171,7 @@ animation_renderer_finalize (GObject *object)
/* Clean remaining data. */
if (renderer->priv->idle_id)
g_source_remove (renderer->priv->idle_id);
+ renderer->priv->idle_id = 0;
g_mutex_lock (&renderer->priv->lock);
for (i = 0; i < animation_get_duration (animation); i++)
{
@@ -183,7 +184,9 @@ animation_renderer_finalize (GObject *object)
g_free (renderer->priv->hashes);
g_async_queue_unref (renderer->priv->queue);
+ renderer->priv->queue = NULL;
g_async_queue_unref (renderer->priv->ack_queue);
+ renderer->priv->ack_queue = NULL;
g_hash_table_destroy (renderer->priv->cache_table);
g_mutex_unlock (&renderer->priv->lock);
g_mutex_clear (&renderer->priv->lock);
@@ -321,7 +324,7 @@ static gboolean
animation_renderer_idle_update (AnimationRenderer *renderer)
{
gpointer p;
- gboolean retval;
+ gboolean retval = G_SOURCE_CONTINUE;;
while ((p = g_async_queue_try_pop (renderer->priv->ack_queue)))
{
@@ -335,16 +338,13 @@ animation_renderer_idle_update (AnimationRenderer *renderer)
/* If nothing is being rendered (negative queue length, meaning the
* renderer is waiting), nor is there anything in the ACK queue, just
* stop the idle source. */
- if (g_async_queue_length (renderer->priv->queue) < 0 &&
+ if (renderer->priv && renderer->priv->queue &&
+ g_async_queue_length (renderer->priv->queue) < 0 &&
g_async_queue_length (renderer->priv->ack_queue) == 0)
{
retval = G_SOURCE_REMOVE;
renderer->priv->idle_id = 0;
}
- else
- {
- retval = G_SOURCE_CONTINUE;
- }
return retval;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]