diff options
author | Campbell Barton <campbell@blender.org> | 2022-06-16 05:29:22 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-06-16 05:29:22 +0300 |
commit | 1fed24de5a38c2133439e78cedc27d265962f90a (patch) | |
tree | d38f705b3d9be67e53e9fa5d314b69d0e5a1480a | |
parent | 409c62aa6182a691cd0fa4734b3a4d6192d9bf64 (diff) |
GHOST/Wayland: acquire locks before freeing data on exit
-rw-r--r-- | intern/ghost/intern/GHOST_SystemWayland.cpp | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/intern/ghost/intern/GHOST_SystemWayland.cpp b/intern/ghost/intern/GHOST_SystemWayland.cpp index 15aa379c531..cf5ba550e55 100644 --- a/intern/ghost/intern/GHOST_SystemWayland.cpp +++ b/intern/ghost/intern/GHOST_SystemWayland.cpp @@ -263,21 +263,36 @@ static void display_destroy(display_t *d) } for (input_t *input : d->inputs) { - if (input->data_source) { - free(input->data_source->buffer_out); - if (input->data_source->data_source) { - wl_data_source_destroy(input->data_source->data_source); + + /* First handle members that require locking. + * While highly unlikely, it's possible they are being used while this function runs. */ + { + std::lock_guard lock{input->data_source_mutex}; + if (input->data_source) { + free(input->data_source->buffer_out); + if (input->data_source->data_source) { + wl_data_source_destroy(input->data_source->data_source); + } + delete input->data_source; } - delete input->data_source; } - if (input->data_offer_dnd) { - wl_data_offer_destroy(input->data_offer_dnd->id); - delete input->data_offer_dnd; + + { + std::lock_guard lock{input->data_offer_dnd_mutex}; + if (input->data_offer_dnd) { + wl_data_offer_destroy(input->data_offer_dnd->id); + delete input->data_offer_dnd; + } } - if (input->data_offer_copy_paste) { - wl_data_offer_destroy(input->data_offer_copy_paste->id); - delete input->data_offer_copy_paste; + + { + std::lock_guard lock{input->data_offer_copy_paste_mutex}; + if (input->data_offer_copy_paste) { + wl_data_offer_destroy(input->data_offer_copy_paste->id); + delete input->data_offer_copy_paste; + } } + if (input->data_device) { wl_data_device_release(input->data_device); } |