[vlc-devel] [PATCH 5/7] video_output: lock the writing of the vout display object

Steve Lhomme robux4 at ycbcr.xyz
Fri Aug 17 11:33:15 CEST 2018


These 3 patches are follow-up to the previous patches that add a lock on 
the display.vd usage. The previous

patches remove one unsafe use outside of the VOUT thread in Forward().

Patch 7/7 uses the lock to protect an access of display->vd in the event 
thread.


On 17/08/2018 11:27, Steve Lhomme wrote:
> In case we want to be able to read it outside of the VOUT thread
> ---
>   src/video_output/video_output.c  |  2 ++
>   src/video_output/vout_internal.h |  2 ++
>   src/video_output/vout_wrapper.c  | 20 ++++++++++++++++----
>   3 files changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> index e91fa0d772..d80f825987 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -149,6 +149,7 @@ static vout_thread_t *VoutCreate(vlc_object_t *object,
>   
>       /* Initialize locks */
>       vlc_mutex_init(&vout->p->filter.lock);
> +    vlc_mutex_init(&vout->p->display.lock);
>       vlc_mutex_init(&vout->p->spu_lock);
>       vlc_mutex_init(&vout->p->window_lock);
>   
> @@ -304,6 +305,7 @@ static void VoutDestructor(vlc_object_t *object)
>       /* Destroy the locks */
>       vlc_mutex_destroy(&vout->p->window_lock);
>       vlc_mutex_destroy(&vout->p->spu_lock);
> +    vlc_mutex_destroy(&vout->p->display.lock);
>       vlc_mutex_destroy(&vout->p->filter.lock);
>       vout_control_Clean(&vout->p->control);
>   
> diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
> index c1a1d6ac5a..ba583e7c8e 100644
> --- a/src/video_output/vout_internal.h
> +++ b/src/video_output/vout_internal.h
> @@ -90,6 +90,8 @@ struct vout_thread_sys_t
>       /* */
>       struct {
>           vout_display_t *vd;
> +        /* locked when modified in the UI thread or read outside that thread */
> +       vlc_mutex_t     lock;
>           bool           use_dr;
>       } display;
>   
> diff --git a/src/video_output/vout_wrapper.c b/src/video_output/vout_wrapper.c
> index bacce55167..734af4bff4 100644
> --- a/src/video_output/vout_wrapper.c
> +++ b/src/video_output/vout_wrapper.c
> @@ -43,20 +43,25 @@ int vout_OpenWrapper(vout_thread_t *vout,
>                        const char *splitter_name, const vout_display_state_t *state)
>   {
>       vout_thread_sys_t *sys = vout->p;
> +    vout_display_t *vd;
>       msg_Dbg(vout, "Opening vout display wrapper");
>   
>       /* */
>       char *modlist = var_InheritString(vout, "vout");
>   
>       if (splitter_name)
> -        sys->display.vd = vout_NewSplitter(vout, &vout->p->original, state, modlist, splitter_name);
> +        vd = vout_NewSplitter(vout, &vout->p->original, state, modlist, splitter_name);
>       else
> -        sys->display.vd = vout_NewDisplay(vout, &vout->p->original, state, modlist);
> +        vd = vout_NewDisplay(vout, &vout->p->original, state, modlist);
>       free(modlist);
>   
> -    if (!sys->display.vd)
> +    if (vd==NULL)
>           return VLC_EGENERIC;
>   
> +    vlc_mutex_lock(&sys->display.lock);
> +    sys->display.vd = vd;
> +    vlc_mutex_unlock(&sys->display.lock);
> +
>       /* */
>       sys->decoder_pool = NULL;
>   
> @@ -69,10 +74,17 @@ int vout_OpenWrapper(vout_thread_t *vout,
>   void vout_CloseWrapper(vout_thread_t *vout, vout_display_state_t *state)
>   {
>       vout_thread_sys_t *sys = vout->p;
> +    vout_display_t *vd;
>   
>       sys->decoder_pool = NULL; /* FIXME remove */
>   
> -    vout_DeleteDisplay(sys->display.vd, state);
> +
> +    vlc_mutex_lock(&sys->display.lock);
> +    vd = sys->display.vd;
> +    sys->display.vd = NULL;
> +    vlc_mutex_unlock(&sys->display.lock);
> +
> +    vout_DeleteDisplay(vd, state);
>   }
>   
>   /*****************************************************************************
> -- 
> 2.17.0
>
> _______________________________________________
> 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