[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:30:25 CEST 2020



On Fri, Aug 14, 2020, at 11:25, Steve Lhomme wrote:
> On 2020-08-14 11:02, Thomas Guillem wrote:
> > Why is it not needed anymore?
> 
> I don't know why it was needed before. Maybe I'm missing something.

I would wait for RĂ©mi's review then.

> 
> > vout_control_Push() will now have to wait that controls are processed.
> 
> I don't see how it's different from now. It needs the lock to push a 
> command. The control pop also gets the lock. So in the while loop to pop 
> all the commands there's a chance for the push to get the lock first. 
> There's also a chance to get the lock while the pop is waiting for its 
> deadline or a wake up.
> 
> > Are you really sure we want that? For example, vout_MouseState() will wait until a flush command is processed.
> 
> Why would it need that ? vout_control_Push() gets the lock as described 
> above.

Yes, but before your patch, vout_control_Hold() was releasing the lock, letting all vout_control_Push() to be executed while the control was 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
> > _______________________________________________
> > 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