[vlc-devel] [PATCH 5/7] vout/control: keep the lock instead of setting a held flag

Steve Lhomme robux4 at ycbcr.xyz
Fri Aug 14 11:34:57 CEST 2020


On 2020-08-14 11:30, Thomas Guillem wrote:
> 
> 
> 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.

Yes, this patchset is tricky (but also making the code easier to 
understand in the end) and sensitive.

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