[clutter] actor: Avoid queueing redraws during destruction
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter] actor: Avoid queueing redraws during destruction
- Date: Tue, 7 Jun 2011 13:36:18 +0000 (UTC)
commit 19c986c0c6e0aa08ae76ab7d992fbf70ae5e44a0
Author: Emmanuele Bassi <ebassi linux intel com>
Date: Tue Jun 7 14:25:17 2011 +0100
actor: Avoid queueing redraws during destruction
If an actor or the stage to which it belongs are being destroyed then
there is no point in queueing a redraw that will not be seen anyway.
Bailing out early also avoids the case in which a redraw is queued
during destruction wil cause redraw entries will be added to the Stage,
which will take references on it and cause the Stage never to be
finalized.
http://bugzilla.clutter-project.org/show_bug.cgi?id=2652
clutter/clutter-actor.c | 18 ++++++++++++------
1 files changed, 12 insertions(+), 6 deletions(-)
---
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index 6218277..49b2a58 100644
--- a/clutter/clutter-actor.c
+++ b/clutter/clutter-actor.c
@@ -5385,17 +5385,13 @@ _clutter_actor_queue_redraw_full (ClutterActor *self,
ClutterPaintVolume *volume,
ClutterEffect *effect)
{
+ ClutterActorPrivate *priv = self->priv;
ClutterPaintVolume allocation_pv;
- ClutterActorPrivate *priv;
ClutterPaintVolume *pv;
gboolean should_free_pv;
ClutterActor *stage;
gboolean was_dirty;
- g_return_if_fail (CLUTTER_IS_ACTOR (self));
-
- priv = self->priv;
-
/* Here's an outline of the actor queue redraw mechanism:
*
* The process starts in one of the following two functions which
@@ -5465,12 +5461,20 @@ _clutter_actor_queue_redraw_full (ClutterActor *self,
* paint.
*/
+ /* ignore queueing a redraw for actors being destroyed */
+ if (CLUTTER_ACTOR_IN_DESTRUCTION (self))
+ return;
+
stage = _clutter_actor_get_stage_internal (self);
- /* Ignore queuing a redraw for actors not descended from a stage */
+ /* Ignore queueing a redraw for actors not descended from a stage */
if (stage == NULL)
return;
+ /* ignore queueing a redraw on stages that are being destroyed */
+ if (CLUTTER_ACTOR_IN_DESTRUCTION (stage))
+ return;
+
if (flags & CLUTTER_REDRAW_CLIPPED_TO_ALLOCATION)
{
ClutterActorBox allocation_clip;
@@ -5581,6 +5585,8 @@ _clutter_actor_queue_redraw_full (ClutterActor *self,
void
clutter_actor_queue_redraw (ClutterActor *self)
{
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+
_clutter_actor_queue_redraw_full (self,
0, /* flags */
NULL, /* clip volume */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]