[vlc-devel] [PATCH] Avoid deadlock on UDP stop

Romain Vimont rom at rom1v.com
Tue May 13 19:52:43 CEST 2014


Hello Tzu-Jung Lee,

As you are the author of commit 57eee64 on udp access, I'd like you to
review this patch.

Thank you in advance.

Regards

--
®om

Le dimanche 11 mai 2014 à 13:36 +0200, Romain Vimont a écrit :
> The call to block_FifoWake() at the end of udp.c/ThreadRead() is not
> sufficient to always prevent block_FifoGet() in udp.c/BlockUDP() from
> blocking indefinitely: it will at most wake up the first, but following
> calls (if any) will never be awakened, causing a deadlock.
> 
> A new flag keeping the "finishing" state of the UDP access is sufficient
> to prevent the deadlock, avoiding unwanted calls to block_FifoGet().
> 
> Signed-off-by: Romain Vimont <rom at rom1v.com>
> ---
>  modules/access/udp.c |   12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/modules/access/udp.c b/modules/access/udp.c
> index 3c18cb8..0e4fc4d 100644
> --- a/modules/access/udp.c
> +++ b/modules/access/udp.c
> @@ -42,6 +42,7 @@
>  #include <vlc_access.h>
>  #include <vlc_network.h>
>  #include <vlc_block.h>
> +#include <vlc_atomic.h>
>  
>  #define MTU 65535
>  
> @@ -75,6 +76,7 @@ struct access_sys_t
>      size_t fifo_size;
>      block_fifo_t *fifo;
>      vlc_thread_t thread;
> +    atomic_bool b_finishing;
>  };
>  
>  /*****************************************************************************
> @@ -166,6 +168,8 @@ static int Open( vlc_object_t *p_this )
>  
>      sys->fifo_size = var_InheritInteger( p_access, "udp-buffer");
>  
> +    sys->b_finishing = false;
> +
>      if( vlc_clone( &sys->thread, ThreadRead, p_access,
>                     VLC_THREAD_PRIORITY_INPUT ) )
>      {
> @@ -231,6 +235,13 @@ static block_t *BlockUDP( access_t *p_access )
>  {
>      access_sys_t *sys = p_access->p_sys;
>  
> +    if( unlikely( atomic_load( &sys->b_finishing ) ) )
> +    {
> +        /* We should not read data anymore */
> +        p_access->info.b_eof = true;
> +        return NULL;
> +    }
> +
>      return block_FifoGet( sys->fifo );
>  }
>  
> @@ -270,6 +281,7 @@ static void* ThreadRead( void *data )
>          block_FifoPut( sys->fifo, pkt );
>      }
>  
> +    atomic_store( &sys->b_finishing, true );
>      block_FifoWake( sys->fifo );
>      return NULL;
>  }
> -- 
> 1.7.10.4
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
> 



More information about the vlc-devel mailing list