[vlc-devel] [PATCH v2] wayland: xdg-shell: use vlc_cond_t instead of dispatch

Rémi Denis-Courmont remi at remlab.net
Tue Apr 7 11:39:57 CEST 2020


Without the surrounding code, I come to think that a semaphore would be far simpler here.

Le 7 avril 2020 11:20:01 GMT+03:00, Alexandre Janniaux <ajanni at videolabs.io> a écrit :
>When using wl_display_dispatch, there is a race condition with the main
>loop, in which the condition `(!sys->wm.configured)` would have been
>checked as true, but the event dispatched from the main thread after
>that so wl_display_dispatch would block indefinitely.
>
>Said differently, wl_display_dispatch should not be called from a
>different thread than the main thread (in wayland terms).
>
>By using a condition variable instead, we let the main thread unblock
>the vout_window_Enable and prevent this deadlock when the callback for
>the configured event is called. In addition, it adds the correct lock
>around the updates and reads of the wm.configured boolean.
>
>Fixes #24586
>---
> modules/video_output/wayland/xdg-shell.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
>diff --git a/modules/video_output/wayland/xdg-shell.c
>b/modules/video_output/wayland/xdg-shell.c
>index 765ffb2a2f..0b0eba0be0 100644
>--- a/modules/video_output/wayland/xdg-shell.c
>+++ b/modules/video_output/wayland/xdg-shell.c
>@@ -106,6 +106,7 @@ typedef struct
>     struct wl_surface *cursor_surface;
> 
>     vlc_mutex_t lock;
>+    vlc_cond_t cond_configured;
>     vlc_thread_t thread;
> } vout_window_sys_t;
> 
>@@ -262,8 +263,10 @@ static int Enable(vout_window_t *wnd, const
>vout_window_cfg_t *restrict cfg)
>     wl_display_flush(display);
> 
> #ifdef XDG_SHELL
>+    vlc_mutex_lock(&sys->lock);
>     while (!sys->wm.configured)
>-        wl_display_dispatch(display);
>+        vlc_cond_wait(&sys->cond_configured, &sys->lock);
>+    vlc_mutex_unlock(&sys->lock);
> #endif
> 
>     return VLC_SUCCESS;
>@@ -339,7 +342,11 @@ static void xdg_surface_configure_cb(void *data,
>struct xdg_surface *surface,
>         vout_window_ReportWindowed(wnd);
> 
>     xdg_surface_ack_configure(surface, serial);
>+
>+    vlc_mutex_lock(&sys->lock);
>     sys->wm.configured = true;
>+    vlc_cond_signal(&sys->cond_configured);
>+    vlc_mutex_unlock(&sys->lock);
> }
> 
> static const struct xdg_surface_listener xdg_surface_cbs =
>@@ -617,6 +624,7 @@ static int Open(vout_window_t *wnd)
>     sys->cursor_theme = NULL;
>     sys->cursor_surface = NULL;
>     vlc_mutex_init(&sys->lock);
>+    vlc_cond_init(&sys->cond_configured);
>     wnd->sys = sys;
>     wnd->handle.wl = NULL;
> 
>-- 
>2.26.0
>
>_______________________________________________
>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/20200407/e2cd6633/attachment.html>


More information about the vlc-devel mailing list