[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