summaryrefslogtreecommitdiff
path: root/transmitters/multicast
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.co.uk>2008-12-28 17:07:56 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.co.uk>2008-12-28 17:07:56 -0500
commitd006a2f390b2302031f7838f49c57cf5c42a622c (patch)
tree352c7dd32b3fe421e3ad92b434b16d9d7770b6c9 /transmitters/multicast
parenta88a6b5952bad37af78b9ae4ce6d54a9718be89e (diff)
downloadfarstream-d006a2f390b2302031f7838f49c57cf5c42a622c.tar.gz
Protect the udpsocks lists with a mutex in mcast
Diffstat (limited to 'transmitters/multicast')
-rw-r--r--transmitters/multicast/fs-multicast-transmitter.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/transmitters/multicast/fs-multicast-transmitter.c b/transmitters/multicast/fs-multicast-transmitter.c
index f075bd51..5ddb7c9d 100644
--- a/transmitters/multicast/fs-multicast-transmitter.c
+++ b/transmitters/multicast/fs-multicast-transmitter.c
@@ -87,6 +87,7 @@ struct _FsMulticastTransmitterPrivate
GstElement **udpsrc_funnels;
GstElement **udpsink_tees;
+ GMutex *mutex;
GList **udpsocks;
gboolean disposed;
@@ -202,6 +203,7 @@ fs_multicast_transmitter_init (FsMulticastTransmitter *self)
self->priv->disposed = FALSE;
self->components = 2;
+ self->priv->mutex = g_mutex_new ();
}
static void
@@ -398,6 +400,8 @@ fs_multicast_transmitter_finalize (GObject *object)
self->priv->udpsocks = NULL;
}
+ g_mutex_free (self->priv->mutex);
+
parent_class->finalize (object);
}
@@ -486,10 +490,12 @@ struct _UdpSock {
gchar *local_ip;
gchar *multicast_ip;
guint16 port;
+ /* Protected by the transmitter mutex */
guint8 current_ttl;
gint fd;
+ /* Protected by the transmitter mutex */
GByteArray *ttls;
/* These are just convenience pointers to our parent transmitter */
@@ -760,6 +766,8 @@ fs_multicast_transmitter_get_udpsock (FsMulticastTransmitter *trans,
return NULL;
}
+ g_mutex_lock (trans->priv->mutex);
+
for (udpsock_e = g_list_first (trans->priv->udpsocks[component_id]);
udpsock_e;
udpsock_e = g_list_next (udpsock_e))
@@ -780,14 +788,17 @@ fs_multicast_transmitter_get_udpsock (FsMulticastTransmitter *trans,
g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
"Error setting the multicast TTL: %s",
g_strerror (errno));
+ g_mutex_unlock (trans->priv->mutex);
return NULL;
}
udpsock->current_ttl = ttl;
}
g_byte_array_append (udpsock->ttls, &ttl, 1);
+ g_mutex_unlock (trans->priv->mutex);
return udpsock;
}
}
+ g_mutex_unlock (trans->priv->mutex);
udpsock = g_slice_new0 (UdpSock);
@@ -828,8 +839,10 @@ fs_multicast_transmitter_get_udpsock (FsMulticastTransmitter *trans,
"sync", FALSE,
NULL);
+ g_mutex_lock (trans->priv->mutex);
trans->priv->udpsocks[component_id] =
g_list_prepend (trans->priv->udpsocks[component_id], udpsock);
+ g_mutex_unlock (trans->priv->mutex);
return udpsock;
@@ -847,6 +860,7 @@ fs_multicast_transmitter_put_udpsock (FsMulticastTransmitter *trans,
{
guint i;
+ g_mutex_lock (trans->priv->mutex);
for (i = udpsock->ttls->len - 1;; i--)
{
if (udpsock->ttls->data[i] == ttl)
@@ -878,17 +892,21 @@ fs_multicast_transmitter_put_udpsock (FsMulticastTransmitter *trans,
{
GST_WARNING ("Error setting the multicast TTL to %u: %s", max,
g_strerror (errno));
+ g_mutex_unlock (trans->priv->mutex);
return;
}
udpsock->current_ttl = max;
}
}
+ g_mutex_unlock (trans->priv->mutex);
return;
}
trans->priv->udpsocks[udpsock->component_id] =
g_list_remove (trans->priv->udpsocks[udpsock->component_id], udpsock);
+ g_mutex_unlock (trans->priv->mutex);
+
if (udpsock->udpsrc)
{
GstStateChangeReturn ret;