[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