[vlc-devel] commit: Warn about reparented object when debugging ( Rémi Denis-Courmont )
git version control
git at videolan.org
Thu Jan 28 21:03:30 CET 2010
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Jan 28 22:03:14 2010 +0200| [c66586a5445aa3405403ca47ee37db7a7bd64481] | committer: Rémi Denis-Courmont
Warn about reparented object when debugging
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c66586a5445aa3405403ca47ee37db7a7bd64481
---
src/libvlc.h | 1 +
src/misc/objects.c | 20 ++++++++++++++++++++
2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/src/libvlc.h b/src/libvlc.h
index 97e5dc1..9949928 100644
--- a/src/libvlc.h
+++ b/src/libvlc.h
@@ -183,6 +183,7 @@ struct vlc_object_internals
vlc_object_internals_t *next; /* next sibling */
vlc_object_internals_t *prev; /* previous sibling */
vlc_object_internals_t *first; /* first child */
+ vlc_object_t *old_parent;
};
#define ZOOM_SECTION N_("Zoom")
diff --git a/src/misc/objects.c b/src/misc/objects.c
index 7d5570f..fb1dc39 100644
--- a/src/misc/objects.c
+++ b/src/misc/objects.c
@@ -154,6 +154,9 @@ void *__vlc_custom_create( vlc_object_t *p_this, size_t i_size,
p_priv->b_thread = false;
p_new->p_parent = NULL;
p_priv->first = NULL;
+#ifndef NDEBUG
+ p_priv->old_parent = NULL;
+#endif
/* Initialize mutexes and condvars */
vlc_mutex_init( &p_priv->var_lock );
@@ -612,6 +615,20 @@ void __vlc_object_attach( vlc_object_t *p_this, vlc_object_t *p_parent )
priv->prev = NULL;
vlc_object_hold (p_parent);
libvlc_lock (p_this->p_libvlc);
+#ifndef NDEBUG
+ /* Reparenting an object carries a risk of invalid access to the parent,
+ * from another thread. This can happen when inheriting a variable, or
+ * through any direct access to vlc_object_t.p_parent. Also, reparenting
+ * brings a functional bug, whereby the reparented object uses incorrect
+ * old values for inherited variables (as the new parent may have different
+ * variable values, especially if it is an input).
+ * Note that the old parent may be already destroyed.
+ * So its pointer must not be dereferenced.
+ */
+ if (priv->old_parent)
+ msg_Info (p_this, "Reparenting an object is dangerous (%p -> %p)!",
+ priv->old_parent, p_parent);
+#endif
/* Attach the parent to its child */
assert (!p_this->p_parent);
@@ -642,6 +659,9 @@ static void vlc_object_detach_unlocked (vlc_object_t *p_this)
priv->next->prev = priv->prev;
/* Remove p_this's parent */
+#ifndef NDEBUG
+ priv->old_parent = p_this->p_parent;
+#endif
p_this->p_parent = NULL;
}
More information about the vlc-devel
mailing list