[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