diff options
author | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2008-12-28 17:11:44 -0500 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2008-12-28 17:11:44 -0500 |
commit | 8ecfcb74a8a40285e136cbeb099b6ccd9c597962 (patch) | |
tree | 8692cf7fdf629aa26ed874643dfa61ff2bb76c1a /transmitters/multicast | |
parent | d006a2f390b2302031f7838f49c57cf5c42a622c (diff) | |
download | farstream-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.c | 55 |
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); |