[vlc-devel] [PATCH 5/7] vout/control: keep the lock instead of setting a held flag
Thomas Guillem
thomas at gllm.fr
Fri Aug 14 11:02:23 CEST 2020
Why is it not needed anymore?
vout_control_Push() will now have to wait that controls are processed. Are you really sure we want that? For example, vout_MouseState() will wait until a flush command is processed.
On Thu, Aug 13, 2020, at 14:12, Steve Lhomme wrote:
> The code calling vout_control_Hold holds the lock until vout_control_Release is
> called. vout_control_Pop() doesn't need to wait for it. If it has the lock no
> other code is "holding" it.
>
> Now vout_control_Release() doesn't wake up the vout_control_Pop() directly.
> Either commands were added and wait_request was signaled. Or nothing was done
> and it doesn't need to wake up vout_control_Pop(). It will be unblocked by new
> commands, a vout_control_Wake call or a deadline timeout.
> ---
> src/video_output/control.c | 17 -----------------
> src/video_output/control.h | 3 ---
> 2 files changed, 20 deletions(-)
>
> diff --git a/src/video_output/control.c b/src/video_output/control.c
> index 675953f2c89..93bf7c3f92a 100644
> --- a/src/video_output/control.c
> +++ b/src/video_output/control.c
> @@ -51,10 +51,7 @@ void vout_control_Init(vout_control_t *ctrl)
> {
> vlc_mutex_init(&ctrl->lock);
> vlc_cond_init(&ctrl->wait_request);
> - vlc_cond_init(&ctrl->wait_available);
>
> - ctrl->is_held = false;
> - ctrl->is_waiting = false;
> ctrl->is_dead = false;
> ctrl->can_sleep = true;
> ARRAY_INIT(ctrl->cmd);
> @@ -125,18 +122,10 @@ void vout_control_PushString(vout_control_t
> *ctrl, int type, const char *string)
> void vout_control_Hold(vout_control_t *ctrl)
> {
> vlc_mutex_lock(&ctrl->lock);
> - while (ctrl->is_held || !ctrl->is_waiting)
> - vlc_cond_wait(&ctrl->wait_available, &ctrl->lock);
> - ctrl->is_held = true;
> - vlc_mutex_unlock(&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);
> }
>
> @@ -148,16 +137,10 @@ int vout_control_Pop(vout_control_t *ctrl,
> vout_control_cmd_t *cmd,
> if (ctrl->cmd.i_size <= 0) {
> /* Spurious wakeups are perfectly fine */
> if (deadline != INVALID_DEADLINE && ctrl->can_sleep) {
> - ctrl->is_waiting = true;
> - vlc_cond_signal(&ctrl->wait_available);
> vlc_cond_timedwait(&ctrl->wait_request, &ctrl->lock,
> deadline);
> - ctrl->is_waiting = false;
> }
> }
>
> - while (ctrl->is_held)
> - vlc_cond_wait(&ctrl->wait_available, &ctrl->lock);
> -
> int ret;
> if (ctrl->cmd.i_size > 0) {
> ret = VLC_SUCCESS;
> diff --git a/src/video_output/control.h b/src/video_output/control.h
> index 6161c5ba3db..af13cc8fede 100644
> --- a/src/video_output/control.h
> +++ b/src/video_output/control.h
> @@ -50,13 +50,10 @@ void vout_control_cmd_Clean(vout_control_cmd_t *);
> typedef struct {
> vlc_mutex_t lock;
> vlc_cond_t wait_request;
> - vlc_cond_t wait_available;
>
> /* */
> bool is_dead;
> bool can_sleep;
> - bool is_waiting;
> - 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