[vlc-devel] [PATCH 10/10] vout: control: replace the custom hold/release/wait by a vlc_sem_t

Steve Lhomme robux4 at ycbcr.xyz
Fri Jul 17 15:12:10 CEST 2020


On 2020-07-17 13:50, Steve Lhomme wrote:
> The goal is to protect the access to the command array.
> 
> We still allow pushing commands from the thread holding the command array, to
> avoid a deadlock if the same thread tries to request this resource twice.
> ---
>   src/video_output/control.c | 28 ++++++++--------------------
>   src/video_output/control.h |  4 +---
>   2 files changed, 9 insertions(+), 23 deletions(-)
> 
> diff --git a/src/video_output/control.c b/src/video_output/control.c
> index 52960d66591..da08d362164 100644
> --- a/src/video_output/control.c
> +++ b/src/video_output/control.c
> @@ -43,10 +43,8 @@ void vout_control_cmd_Clean(vout_control_cmd_t *cmd)
>   /* */
>   void vout_control_Init(vout_control_t *ctrl)
>   {
> -    vlc_mutex_init(&ctrl->lock);
> -    vlc_cond_init(&ctrl->wait_available);
> +    vlc_sem_init(&ctrl->lock, 1);
>   
> -    ctrl->is_held = false;
>       atomic_init(&ctrl->is_dead, false);
>       ARRAY_INIT(ctrl->cmd);
>   }
> @@ -68,13 +66,14 @@ void vout_control_Dead(vout_control_t *ctrl)
>   
>   static void vout_control_Push(vout_control_t *ctrl, vout_control_cmd_t *cmd)
>   {
> -    vlc_mutex_lock(&ctrl->lock);
> +    bool locked = vlc_sem_trywait(&ctrl->lock) == 0;

I misread what this does. If another thread has the resource it will 
consider it's already locked and assume it's lock by the current thread.

So forget this patch for now.

>       if (!atomic_load(&ctrl->is_dead)) {
>           ARRAY_APPEND(ctrl->cmd, *cmd);
>       } else {
>           vout_control_cmd_Clean(cmd);
>       }
> -    vlc_mutex_unlock(&ctrl->lock);
> +    if (locked)
> +        vlc_sem_post(&ctrl->lock);
>   }
>   
>   void vout_control_PushVoid(vout_control_t *ctrl, int type)
> @@ -110,28 +109,17 @@ void vout_control_PushMouse(vout_control_t *ctrl, int type, const vlc_mouse_t *m
>   
>   void vout_control_Hold(vout_control_t *ctrl)
>   {
> -    vlc_mutex_lock(&ctrl->lock);
> -    while (ctrl->is_held)
> -        vlc_cond_wait(&ctrl->wait_available, &ctrl->lock);
> -    ctrl->is_held = true;
> -    vlc_mutex_unlock(&ctrl->lock);
> +    vlc_sem_wait(&ctrl->lock);
>   }
>   
>   void vout_control_Release(vout_control_t *ctrl)
>   {
> -    vlc_mutex_lock(&ctrl->lock);
> -    assert(ctrl->is_held);
> -    ctrl->is_held = false;
> -    vlc_cond_signal(&ctrl->wait_available);
> -    vlc_mutex_unlock(&ctrl->lock);
> +    vlc_sem_post(&ctrl->lock);
>   }
>   
>   int vout_control_Pop(vout_control_t *ctrl, vout_control_cmd_t *cmd)
>   {
> -    vlc_mutex_lock(&ctrl->lock);
> -
> -    while (ctrl->is_held)
> -        vlc_cond_wait(&ctrl->wait_available, &ctrl->lock);
> +    vlc_sem_wait(&ctrl->lock);
>   
>       int ret;
>       if (ctrl->cmd.i_size > 0) {
> @@ -141,7 +129,7 @@ int vout_control_Pop(vout_control_t *ctrl, vout_control_cmd_t *cmd)
>       } else {
>           ret = VLC_EGENERIC;
>       }
> -    vlc_mutex_unlock(&ctrl->lock);
> +    vlc_sem_post(&ctrl->lock);
>   
>       return ret;
>   }
> diff --git a/src/video_output/control.h b/src/video_output/control.h
> index 882b887b959..91afdd92f64 100644
> --- a/src/video_output/control.h
> +++ b/src/video_output/control.h
> @@ -47,12 +47,10 @@ typedef struct {
>   void vout_control_cmd_Clean(vout_control_cmd_t *);
>   
>   typedef struct {
> -    vlc_mutex_t lock;
> -    vlc_cond_t  wait_available;
> +    vlc_sem_t   lock;
>   
>       /* */
>       atomic_bool is_dead;
> -    bool is_held;
>       DECL_ARRAY(vout_control_cmd_t) cmd;
>   } vout_control_t;
>   
> -- 
> 2.26.2
> 
> _______________________________________________
> 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