[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:34:32 CEST 2018


On 17/08/2018 11:33, Steve Lhomme wrote:
> 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.
6/7

7/7 is the dynamic stereo mode capability check.

>
>
> 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
>
> _______________________________________________
> 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