summaryrefslogtreecommitdiff
path: root/transmitters/multicast
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.co.uk>2008-12-28 17:11:44 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.co.uk>2008-12-28 17:11:44 -0500
commit8ecfcb74a8a40285e136cbeb099b6ccd9c597962 (patch)
tree8692cf7fdf629aa26ed874643dfa61ff2bb76c1a /transmitters/multicast
parentd006a2f390b2302031f7838f49c57cf5c42a622c (diff)
downloadfarstream-8ecfcb74a8a40285e136cbeb099b6ccd9c597962.tar.gz
Make sure the same udpsock is not created twice in mcast
Diffstat (limited to 'transmitters/multicast')
-rw-r--r--transmitters/multicast/fs-multicast-transmitter.c55
1 files changed, 42 insertions, 13 deletions
diff --git a/transmitters/multicast/fs-multicast-transmitter.c b/transmitters/multicast/fs-multicast-transmitter.c
index 5ddb7c9d..62bc3058 100644
--- a/transmitters/multicast/fs-multicast-transmitter.c
+++ b/transmitters/multicast/fs-multicast-transmitter.c
@@ -746,8 +746,8 @@ _create_sinksource (gchar *elementname, GstBin *bin,
return NULL;
}
-UdpSock *
-fs_multicast_transmitter_get_udpsock (FsMulticastTransmitter *trans,
+static UdpSock *
+fs_multicast_transmitter_get_udpsock_locked (FsMulticastTransmitter *trans,
guint component_id,
const gchar *local_ip,
const gchar *multicast_ip,
@@ -758,16 +758,6 @@ fs_multicast_transmitter_get_udpsock (FsMulticastTransmitter *trans,
UdpSock *udpsock;
GList *udpsock_e;
- /* First lets check if we already have one */
- if (component_id > trans->components)
- {
- g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
- "Invalid component %d > %d", component_id, trans->components);
- 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))
@@ -788,7 +778,6 @@ 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;
@@ -798,8 +787,37 @@ fs_multicast_transmitter_get_udpsock (FsMulticastTransmitter *trans,
return udpsock;
}
}
+ return NULL;
+}
+
+UdpSock *
+fs_multicast_transmitter_get_udpsock (FsMulticastTransmitter *trans,
+ guint component_id,
+ const gchar *local_ip,
+ const gchar *multicast_ip,
+ guint16 port,
+ guint8 ttl,
+ GError **error)
+{
+ UdpSock *udpsock;
+ UdpSock *tmpudpsock;
+
+ /* First lets check if we already have one */
+ if (component_id > trans->components)
+ {
+ g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
+ "Invalid component %d > %d", component_id, trans->components);
+ return NULL;
+ }
+
+ g_mutex_lock (trans->priv->mutex);
+ udpsock = fs_multicast_transmitter_get_udpsock_locked (trans, component_id,
+ local_ip, multicast_ip, port, ttl, error);
g_mutex_unlock (trans->priv->mutex);
+ if (udpsock)
+ return udpsock;
+
udpsock = g_slice_new0 (UdpSock);
udpsock->local_ip = g_strdup (local_ip);
@@ -840,6 +858,17 @@ fs_multicast_transmitter_get_udpsock (FsMulticastTransmitter *trans,
NULL);
g_mutex_lock (trans->priv->mutex);
+ /* Check if someone else has added the same thing at the same time */
+ tmpudpsock = fs_multicast_transmitter_get_udpsock_locked (trans, component_id,
+ local_ip, multicast_ip, port, ttl, error);
+
+ if (tmpudpsock)
+ {
+ g_mutex_unlock (trans->priv->mutex);
+ fs_multicast_transmitter_put_udpsock (trans, udpsock, ttl);
+ return tmpudpsock;
+ }
+
trans->priv->udpsocks[component_id] =
g_list_prepend (trans->priv->udpsocks[component_id], udpsock);
g_mutex_unlock (trans->priv->mutex);