mirror of
https://github.com/mpv-player/mpv
synced 2025-03-11 08:37:59 +00:00
A deadlock bug was reported with the following test program: mpv_handle *mpv = mpv_create(); mpv_set_option_string(mpv, "ytdl", "yes"); mpv_initialize(mpv); mpv_terminate_destroy(mpv); The cause of this is loading the ytdl.lua script, which triggers a certain code path that calls mp_dispatch_queue_process() recursively. It does so to wait until the script is loaded, and we want to keep that. Reentrancy was not supported by mp_dispatch, which leads to the deadlock. Rewrite the locking so that it does. We mainly get rid of the "exclusive_lock" mutex. Instead we use the existing lock/condition variable to wait until we can grab a logical lock. Note that the lock_frame business can be replaced with a simple counter. Instead of checking the lock_frame address, it'd simply increment and store the counter when entering mp_dispatch_queue_process(), and then compare the counter to decide whether or not to wait. But I think the additional error checking done by the lock_frame list is valuable. Fixes #3489. |
||
---|---|---|
.. | ||
bstr.c | ||
bstr.h | ||
charset_conv.c | ||
charset_conv.h | ||
ctype.h | ||
dispatch.c | ||
dispatch.h | ||
json.c | ||
json.h | ||
node.c | ||
node.h | ||
rendezvous.c | ||
rendezvous.h | ||
ring.c | ||
ring.h |