1
0
mirror of https://github.com/mpv-player/mpv synced 2025-02-24 00:46:58 +00:00
mpv/video
Dudemanguy 10e11834e5 wayland: avoid potential deadlocks
wl_display_dispatch is dangerous because it will block forever if the
event queue is empty. Any direct calls to this function should just be
replaced with wl_display_dispatch_pending which accomplishes the same
thing for mpv's purposes without any chance of blocking.

The other potential trap is wl_display_roundtrip. It can internally call
wl_display_dispatch which in certain circumstances could potentially
block. There are cases where we need the server to finish processing
client requests before doing anything else so this can not be cleanly
avoided. The dangerous call is the usage of wl_display_roundtrip in
vo_wayland_wait_frame. In the majority of cases, this shouldn't be a
problem because the previous wl_display_read_events should always queue
up some events on the fd for wl_display_roundtrip to send. However, the
compositor could potentially send us an error in the display queue that
could lead to bad behavior when wl_display_roundtrip is called.

The wl_display_roundtrip can't be removed because we are relying on its
semi-blocking capabilities, but the logic can be slightly adjusted to be
safer. The obvious thing to do is to make sure we check the pollfd for
any errors. If one is returned, then we call wl_display_cancel_read and
try again. The less obvious trick is to call wl_display_dispatch_pending
and move wl_display_roundtrip outside of the blocking + timeout loop.

This change has some subtle but important differences. Previously,
vo_wayland_wait_frame would read an event and wait on the server to
process it one-by-one. With this change, the events are dispatched as
soon as possible to the server and then we wait on all of those
(potentially multiple) events to be processed after we have either
received frame callback or the loop times out.

After that is done, we can then check for if there are any errors on the
display. If it's all clear, we can run wl_display_roundtrip without any
worries. If some error happens, then don't execute the function at all.
2020-07-31 21:23:45 +00:00
..
decode options: make imgfmt options always accept "no" 2020-04-09 11:20:45 +02:00
filter draw_bmp: rewrite 2020-05-09 18:02:57 +02:00
out wayland: avoid potential deadlocks 2020-07-31 21:23:45 +00:00
csputils.c vo_gpu: reinterpret SDR white levels based on ITU-R BT.2408 2020-06-15 01:24:04 +02:00
csputils.h vo_gpu: reinterpret SDR white levels based on ITU-R BT.2408 2020-06-15 01:24:04 +02:00
cuda.c video: cuda: add explicit context creation for copy hwaccels 2019-12-29 14:32:47 -08:00
d3d.c video: remove mp_image_params.hw_flags field 2019-10-17 22:43:14 +02:00
d3d.h video: move d3d.c out of decode sub directory 2017-12-01 17:58:56 +01:00
fmt-conversion.c video: alias IMGFMT_RGB30 to AV_PIX_FMT_X2RGB10 2020-06-17 19:43:09 +02:00
fmt-conversion.h
hwdec.c video: cuda: add explicit context creation for copy hwaccels 2019-12-29 14:32:47 -08:00
hwdec.h video: cuda: add explicit context creation for copy hwaccels 2019-12-29 14:32:47 -08:00
image_loader.c screenshot, vo_image: use global swscale/zimg parameters 2019-10-31 15:44:09 +01:00
image_loader.h
image_writer.c video: clean up some imgfmt related stuff 2020-05-18 01:54:59 +02:00
image_writer.h screenshot, vo_image: use global swscale/zimg parameters 2019-10-31 15:44:09 +01:00
img_format.c video: some concessions to big endian hosts 2020-06-17 19:44:45 +02:00
img_format.h img_format: expose another helper 2020-05-21 02:29:05 +02:00
mp_image_pool.c mp_image_pool: expose a function for reporting hw download format 2019-10-02 21:07:14 +02:00
mp_image_pool.h mp_image_pool: expose a function for reporting hw download format 2019-10-02 21:07:14 +02:00
mp_image.c mp_image: add helper for clearing regions outside of a rectangle 2020-05-22 14:18:35 +02:00
mp_image.h mp_image: add helper for clearing regions outside of a rectangle 2020-05-22 14:18:35 +02:00
repack.c repack: handle endian in a more general way 2020-06-17 19:43:09 +02:00
repack.h repack: add support for converting from/to float formats 2020-05-09 18:02:57 +02:00
sws_utils.c sws_utils: do not mutate src/dst parameters 2020-07-08 22:45:12 +02:00
sws_utils.h sws_utils: allow setting zimg options directly 2020-05-09 18:02:57 +02:00
vaapi.c vaapi: correct broken NULL check 2020-06-03 15:12:08 +02:00
vaapi.h vo_gpu: hwdec_vaapi: Suppress format errors when probing 2019-07-08 01:57:02 +02:00
vdpau_functions.inc
vdpau_mixer.c video: redo video equalizer option handling 2017-08-22 17:01:35 +02:00
vdpau_mixer.h video: redo video equalizer option handling 2017-08-22 17:01:35 +02:00
vdpau.c video: remove RGB32/BGR32 aliases 2020-05-11 19:57:34 +02:00
vdpau.h vd_lavc, vdpau, vaapi: restore emulated API avoidance 2017-12-02 04:53:51 +01:00
zimg.c zimg: add slice threading and use it by default 2020-07-15 22:59:17 +02:00
zimg.h zimg: add slice threading and use it by default 2020-07-15 22:59:17 +02:00