summaryrefslogtreecommitdiff
path: root/clutter
diff options
context:
space:
mode:
authorRobert Bragg <robert@linux.intel.com>2010-10-26 17:43:16 +0100
committerRobert Bragg <robert@linux.intel.com>2010-11-03 17:28:45 +0000
commitbbf27e6b285afca1261eaa448096667415d81219 (patch)
tree5db9cf2edb7a54d1d50cf916763794b836005d1f /clutter
parente5202d6a0da1d94f65ddbe381766d775e1047e26 (diff)
downloadclutter-bbf27e6b285afca1261eaa448096667415d81219.tar.gz
material-node: track if node owns reference on parent
MaterialNodes are used for the sparse graph of material state and layer state. In the case of materials there is the idea of weak materials that don't take a reference on their parent and in that case we need to be careful not to unref our parent during _cogl_material_node_unparent_real. This adds a has_parent_reference member to the CoglMaterialNode struct so we now know when to skip the unref.
Diffstat (limited to 'clutter')
-rw-r--r--clutter/cogl/cogl/cogl-material-private.h4
-rw-r--r--clutter/cogl/cogl/cogl-material.c4
2 files changed, 7 insertions, 1 deletions
diff --git a/clutter/cogl/cogl/cogl-material-private.h b/clutter/cogl/cogl/cogl-material-private.h
index eb20b3860..88dbfc0e8 100644
--- a/clutter/cogl/cogl/cogl-material-private.h
+++ b/clutter/cogl/cogl/cogl-material-private.h
@@ -138,6 +138,10 @@ struct _CoglMaterialNode
/* The parent material/layer */
CoglMaterialNode *parent;
+ /* TRUE if the node took a strong reference on its parent. Weak
+ * materials for instance don't take a reference on their parent. */
+ gboolean has_parent_reference;
+
/* As an optimization for creating leaf node materials/layers (the
* most common) we don't require any list node allocations to link
* to a single descendant. */
diff --git a/clutter/cogl/cogl/cogl-material.c b/clutter/cogl/cogl/cogl-material.c
index 905e0e5fd..720350821 100644
--- a/clutter/cogl/cogl/cogl-material.c
+++ b/clutter/cogl/cogl/cogl-material.c
@@ -127,6 +127,7 @@ _cogl_material_node_set_parent_real (CoglMaterialNode *node,
}
node->parent = parent;
+ node->has_parent_reference = take_strong_reference;
/* Now that there is a consistent parent->child link we can remove
* the parent reference if no reference was requested. If it turns
@@ -160,7 +161,8 @@ _cogl_material_node_unparent_real (CoglMaterialNode *node)
else
parent->children = g_list_remove (parent->children, node);
- cogl_object_unref (parent);
+ if (node->has_parent_reference)
+ cogl_object_unref (parent);
node->parent = NULL;
}