[vlc-devel] [PATCH 2/2] xdg-shell: acknowledge size change timely (fixes #25112)
Rémi Denis-Courmont
remi at remlab.net
Wed Feb 10 07:40:18 UTC 2021
Hi,
The only thing that moves into the crititcal section is the sending of the acknowledgement to the shell. Every thing else was under that lock already.
Le 10 février 2021 08:45:28 GMT+02:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
>On 2021-02-09 18:04, remi at remlab.net wrote:
>> From: Rémi Denis-Courmont <remi at remlab.net>
>>
>> ---
>> modules/video_output/wayland/xdg-shell.c | 32
>++++++++++++++++--------
>> 1 file changed, 22 insertions(+), 10 deletions(-)
>>
>> diff --git a/modules/video_output/wayland/xdg-shell.c
>b/modules/video_output/wayland/xdg-shell.c
>> index 0b0eba0be0..3a91114caf 100644
>> --- a/modules/video_output/wayland/xdg-shell.c
>> +++ b/modules/video_output/wayland/xdg-shell.c
>> @@ -157,7 +157,20 @@ static void *Thread(void *data)
>> //return NULL;
>> }
>>
>> -static void ReportSize(vout_window_t *wnd)
>> +static void ResizeAck(vout_window_t *wnd, void *data)
>> +{
>> +#ifdef XDG_SHELL
>> + vout_window_sys_t *sys = wnd->sys;
>> + uint32_t *serial = data;
>> +
>> + if (serial != NULL)
>> + xdg_surface_ack_configure(sys->surface, *serial);
>> +#else
>> + (void) wnd; (void) data;
>> +#endif
>> +}
>> +
>> +static void ReportSize(vout_window_t *wnd, void *data)
>> {
>> vout_window_sys_t *sys = wnd->sys;
>> /* Zero wm.width or zero wm.height means the client should
>choose.
>> @@ -165,7 +178,7 @@ static void ReportSize(vout_window_t *wnd)
>> unsigned width = sys->wm.width ? sys->wm.width :
>sys->set.width;
>> unsigned height = sys->wm.height ? sys->wm.height :
>sys->set.height;
>>
>> - vout_window_ReportSize(wnd, width, height);
>> + wnd->owner.cbs->resized(wnd, width, height, ResizeAck, data);
>> xdg_surface_set_window_geometry(sys->surface, 0, 0, width,
>height);
>> }
>>
>> @@ -184,7 +197,7 @@ static void Resize(vout_window_t *wnd, unsigned
>width, unsigned height)
>> vlc_mutex_lock(&sys->lock);
>> sys->set.width = width;
>> sys->set.height = height;
>> - ReportSize(wnd);
>> + ReportSize(wnd, NULL);
>> vlc_mutex_unlock(&sys->lock);
>> wl_display_flush(wnd->display.wl);
>> }
>> @@ -330,23 +343,22 @@ static void xdg_surface_configure_cb(void
>*data, struct xdg_surface *surface,
>> vout_window_t *wnd = data;
>> vout_window_sys_t *sys = wnd->sys;
>>
>> - vlc_mutex_lock(&sys->lock);
>> - sys->wm.width = sys->wm.latch.width;
>> - sys->wm.height = sys->wm.latch.height;
>> - ReportSize(wnd);
>> - vlc_mutex_unlock(&sys->lock);
>> -
>> if (sys->wm.latch.fullscreen)
>> vout_window_ReportFullscreen(wnd, NULL);
>> else
>> vout_window_ReportWindowed(wnd);
>>
>> - xdg_surface_ack_configure(surface, serial);
>> + vlc_mutex_lock(&sys->lock);
>> + sys->wm.width = sys->wm.latch.width;
>> + sys->wm.height = sys->wm.latch.height;
>> + ReportSize(wnd, &serial);
>> + vlc_mutex_unlock(&sys->lock);
>
>Now there is code that is under sys->lock that will be called under
>vout::display_lock (ResizeAck). Could this lead to deadlocks, for
>instance if the order of locking is different ?
>
>> vlc_mutex_lock(&sys->lock);
>> sys->wm.configured = true;
>> vlc_cond_signal(&sys->cond_configured);
>> vlc_mutex_unlock(&sys->lock);
>> + (void) surface;
>> }
>>
>> static const struct xdg_surface_listener xdg_surface_cbs =
>> --
>> 2.30.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
--
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20210210/7b53fa45/attachment.html>
More information about the vlc-devel
mailing list