[vlc-devel] [PATCH] udp: add timeout parameter
Rémi Denis-Courmont
remi at remlab.net
Tue Mar 15 18:18:16 CET 2016
Le 2016-03-15 18:16, Ilkka Ollakka a écrit :
> By default we wait -1 as previously, but you can give --udp-timeout
> as timeout in seconds
> how long we wait for next packet before deciding that input has
> ended.
> ---
> modules/access/udp.c | 31 ++++++++++++++++++++++++++++---
> 1 file changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/modules/access/udp.c b/modules/access/udp.c
> index b243fce..84f7918 100644
> --- a/modules/access/udp.c
> +++ b/modules/access/udp.c
> @@ -43,6 +43,9 @@
> #include <vlc_network.h>
> #include <vlc_block.h>
> #include <vlc_interrupt.h>
> +#ifdef HAVE_POLL
> +# include <poll.h>
> +#endif
> #include <fcntl.h>
>
>
>
> /*****************************************************************************
> @@ -53,6 +56,7 @@ static void Close( vlc_object_t * );
>
> #define BUFFER_TEXT N_("Receive buffer")
> #define BUFFER_LONGTEXT N_("UDP receive buffer size (bytes)" )
> +#define TIMEOUT_TEXT N_("UDP Source timeout (sec)")
>
> vlc_module_begin ()
> set_shortname( N_("UDP" ) )
> @@ -62,6 +66,9 @@ vlc_module_begin ()
>
> add_obsolete_integer( "server-port" ) /* since 2.0.0 */
> add_integer( "udp-buffer", 0x400000, BUFFER_TEXT,
> BUFFER_LONGTEXT, true )
> +#ifdef HAVE_POLL
> + add_integer( "udp-timeout", -1, TIMEOUT_TEXT, NULL, true )
> +#endif
>
> set_capability( "access", 0 )
> add_shortcut( "udp", "udpstream", "udp4", "udp6" )
> @@ -72,6 +79,7 @@ vlc_module_end ()
> struct access_sys_t
> {
> int fd;
> + int timeout;
> size_t mtu;
> size_t fifo_size;
> block_fifo_t *fifo;
> @@ -181,6 +189,12 @@ static int Open( vlc_object_t *p_this )
> sys->fifo_size = var_InheritInteger( p_access, "udp-buffer");
> vlc_sem_init( &sys->semaphore, 0 );
>
> +#ifdef HAVE_POLL
Why?
> + sys->timeout = var_InheritInteger( p_access, "udp-timeout");
> + if( sys->timeout > 0)
> + sys->timeout *= 1000;
> +#endif
> +
> if( vlc_clone( &sys->thread, ThreadRead, p_access,
> VLC_THREAD_PRIORITY_INPUT ) )
> {
> @@ -291,9 +305,20 @@ static void* ThreadRead( void *data )
> block_cleanup_push(pkt);
> do
> {
> -#ifndef LIBVLC_USE_PTHREAD
> - struct pollfd ufd = { .fd = sys->fd, .events = POLLIN };
> - while (poll(&ufd, 1, -1) <= 0); /* cancellation point */
> +#ifdef HAVE_POLL
> + int poll_return=0;
> + struct pollfd ufd[1];
> + ufd[0].fd = sys->fd;
> + ufd[0].events = POLLIN;
> +
> + while ((poll_return = poll(ufd, 1, sys->timeout)) < 0);
> /* cancellation point */
> + if (unlikely( poll_return == 0))
> + {
> + msg_Err( access, "Timeout on receiving, timeout %d
> seconds", sys->timeout/1000 );
> + access->info.b_eof=1;
I think accessing b_eof here is UB.
> + len = 0;
> + break;
> + }
> #endif
> len = recvmsg(sys->fd, &msg, 0);
> }
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list