[farsight2/master] Remove weak references on object destruction (as the parent may slighly outlive the child)
Olivier Crête
olivier.crete at collabora.co.uk
Tue Dec 23 15:22:03 PST 2008
---
gst/fsrtpconference/fs-rtp-conference.c | 25 +++++++++++++++++++++++++
gst/fsrtpconference/fs-rtp-session.c | 18 +++++++++++++++++-
2 files changed, 42 insertions(+), 1 deletions(-)
diff --git a/gst/fsrtpconference/fs-rtp-conference.c b/gst/fsrtpconference/fs-rtp-conference.c
index 3826bcf..46b8051 100644
--- a/gst/fsrtpconference/fs-rtp-conference.c
+++ b/gst/fsrtpconference/fs-rtp-conference.c
@@ -142,6 +142,14 @@ static void _rtpbin_on_bye_ssrc (GstElement *rtpbin,
guint ssrc,
gpointer user_data);
+static void
+_remove_session (gpointer user_data,
+ GObject *where_the_object_was);
+static void
+_remove_participant (gpointer user_data,
+ GObject *where_the_object_was);
+
+
static void fs_rtp_conference_handle_message (
GstBin * bin,
GstMessage * message);
@@ -166,6 +174,7 @@ static void
fs_rtp_conference_dispose (GObject * object)
{
FsRtpConference *self = FS_RTP_CONFERENCE (object);
+ GList *item;
if (self->priv->disposed)
return;
@@ -175,6 +184,22 @@ fs_rtp_conference_dispose (GObject * object)
self->gstrtpbin = NULL;
}
+ GST_OBJECT_LOCK (object);
+ for (item = g_list_first (self->priv->sessions);
+ item;
+ item = g_list_next (item))
+ g_object_weak_unref (G_OBJECT (item->data), _remove_session, self);
+ g_list_free (self->priv->sessions);
+ self->priv->sessions = NULL;
+
+ for (item = g_list_first (self->priv->participants);
+ item;
+ item = g_list_next (item))
+ g_object_weak_unref (G_OBJECT (item->data), _remove_participant, self);
+ g_list_free (self->priv->participants);
+ self->priv->participants = NULL;
+ GST_OBJECT_UNLOCK (object);
+
self->priv->disposed = TRUE;
G_OBJECT_CLASS (parent_class)->dispose (object);
diff --git a/gst/fsrtpconference/fs-rtp-session.c b/gst/fsrtpconference/fs-rtp-session.c
index e908a6b..7f50c2c 100644
--- a/gst/fsrtpconference/fs-rtp-session.c
+++ b/gst/fsrtpconference/fs-rtp-session.c
@@ -200,6 +200,9 @@ static FsStreamTransmitter *fs_rtp_session_get_new_stream_transmitter (
GParameter *parameters,
GError **error);
+static void
+_remove_stream (gpointer user_data,
+ GObject *where_the_object_was);
static GObjectClass *parent_class = NULL;
@@ -321,6 +324,7 @@ static void
fs_rtp_session_dispose (GObject *object)
{
FsRtpSession *self = FS_RTP_SESSION (object);
+ GList *item = NULL;
if (self->priv->disposed) {
/* If dispose did already run, return. */
@@ -525,6 +529,18 @@ fs_rtp_session_dispose (GObject *object)
self->priv->conference = NULL;
}
+ for (item = g_list_first (self->priv->streams);
+ item;
+ item = g_list_next (item))
+ g_object_weak_unref (G_OBJECT (item->data), _remove_stream, self);
+ g_list_free (self->priv->streams);
+ self->priv->streams = NULL;
+
+ self->priv->disposed = TRUE;
+
+
+ FS_RTP_SESSION_UNLOCK (self);
+
/* MAKE sure dispose does not run twice. */
self->priv->disposed = TRUE;
@@ -1132,7 +1148,7 @@ fs_rtp_session_constructed (GObject *object)
static void
_remove_stream (gpointer user_data,
- GObject *where_the_object_was)
+ GObject *where_the_object_was)
{
FsRtpSession *self = FS_RTP_SESSION (user_data);
--
1.5.6.5
More information about the farsight-commits
mailing list